2015-06-12 72 views
2

是否有可能创建一个sap.ui.controller这样的:即时创建一个UI5 - 控制器

sap.ui.controller("controllerId", "{onAfterRendering: function(){}}"); 

用例是,我有上飞创建了一个控制器的服务器, 如果需要的话。

当我拿到逻辑字符串,并尝试使用它这样的:

var oView = sap.ui.view({ 
    type: sap.ui.core.mvc.ViewType.JSON, 
    viewContent: viewContent, 
    controller: sap.ui.controller("controllerId", "{onAfterRendering: function(){}}") 
}); 

控制器总是未定义

有关该主题的任何提示?

编辑2:

蒂莫西·格鲁特更新的答案后:
是的,我发的AJAX调用服务器。我已经试过了现在:

var ajaxAnswer = 'sap.ui.controller("testForm", { oView: null, onAfterRendering: function(oEvent){oView = oEvent.getSource();} });' 

eval('var controller =' + ajaxAnswer); 

controller不确定。

编辑

根据答案,我想我需要使它更加清晰:

这部分"{onAfterRendering: function(){}}"来自服务器为一个字符串。我无法删除该字符串中的任何引号。我可以用JSON.parse()解析它,但是不能解析一个函数。

+0

这突然成了比我想象的更好的问题。不挂断。 –

+0

请参阅更新的答案。 –

回答

1

我报在github/SAP/openui5的问题后,他们表现出正确的方式来实现一个sap.ui.controller。This is a JSBin Example
你应该的eval()ajax的答案:

var ajaxAnswer = '{ oView: null, onAfterRendering: function(oEvent){oView = oEvent.getSource();} });'; 

eval('sap.ui.controller("testForm", ' + ajaxAnswer + ');'); 

,然后让查看实例化控制器:

var oViewDialog = sap.ui.view({ 
      type: sap.ui.core.mvc.ViewType.JSON, 
      viewContent: JSON.stringify(oTreeTableModel.getData()), 
      controller: sap.ui.controller("testForm") 
     }); 

由于文档sap.ui.controller返回void或sap.ui.core。 mvc.Controller,取决于用例。

sap.ui.controller总是由具有控制器名称的View实例化。如果你创建一个sap.ui.controller("<Insert Name Here>", code Implementation)
你可以在你的视图中用sap.ui.controller("<Insert Same Name As Above>")实例化它。

2

按照documentation provided with your framework ...

构造用于控制器epects一个字符串和一个对象文字作为参数。

由于您要添加的字符串包含看起来像对象字面值的内容,因此您只需删除引号即可。

这样的:

var oView = sap.ui.view({ 
    type: sap.ui.core.mvc.ViewType.JSON, 
    viewContent: viewContent, 
    controller: sap.ui.controller("controllerId", {onAfterRendering: function(){}}) 
}); 

如果由于某种原因传递给你的逻辑始终是一个字符串(因为它是由一个Ajax调用或返回无论是什么原因),你只需要解析JSON首先将字符串转换为对象。

大多数浏览器都支持JSON.parse(json);为此,

但将抛出一个合适的,如果我们通过它你的榜样,因为它不会解析功能。要做到这一点,我们只需要告诉它如何解析功能:

function parseJsonWithFunctions(jsonText) 
{ 
    return JSON.parse(jsonText, function (key, value) 
    { 
     if (value && (typeof value === 'string') && value.indexOf("function") === 0) { 
     // i know eval() is evil, so be careful please. 
     eval("var jsFunc = " + value); 
     return jsFunc; 
     } 

     return value; 
    }); 
} 

现在,我们可以做到这一点:

var oView = sap.ui.view({ 
    type: sap.ui.core.mvc.ViewType.JSON, 
    viewContent: viewContent, 
    controller: sap.ui.controller("controllerId", parseJsonWithFunctions("{onAfterRendering: function(){}}") 
});