是否可以像这样创建 sap.ui.controller :
sap.ui.controller("controllerId", "{onAfterRendering: function(){}}");
Use-Case是,如果需要,我有一个可以动态创建控制器的服务器。
当我将Logic作为String并尝试使用它时:
var oView = sap.ui.view({
type: sap.ui.core.mvc.ViewType.JSON,
viewContent: viewContent,
controller: sap.ui.controller("controllerId", "{onAfterRendering: function(){}}")
});
Controller总是未定义。
有关该主题的任何提示?
编辑2:
Timothy Groote更新回答后:
是的,我向服务器发送了一个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 :(得分:2)
根据documentation provided with your framework ...
控制器的构造函数将字符串和对象文字视为参数。
由于您尝试添加的字符串包含的内容类似于对象字面值,因此您需要删除它周围的引号。
像这样: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(){}}")
});
答案 1 :(得分:1)
我在github / SAP / openui5上报告了一个问题后,他们展示了实现sap.ui.controller的正确方法。
你应该只是eval()ajax答案:
var ajaxAnswer = '{ oView: null, onAfterRendering: function(oEvent){oView = oEvent.getSource();} });';
eval('sap.ui.controller("testForm", ' + ajaxAnswer + ');');
然后让View实例化控制器:
var oViewDialog = sap.ui.view({
type: sap.ui.core.mvc.ViewType.JSON,
viewContent: JSON.stringify(oTreeTableModel.getData()),
controller: sap.ui.controller("testForm")
});
由于文档This is a JSBin Example返回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>")
在视图中对其进行实例化。