即时创建 UI5 控制器
Create a UI5-Controller on the Fly
是否可以像这样创建一个 sap.ui.controller:
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:
Timothy Groote 更新答案后:
是的,我向服务器发送了一个 AJAX-Call。我现在已经试过了:
var ajaxAnswer = 'sap.ui.controller("testForm", { oView: null, onAfterRendering: function(oEvent){oView = oEvent.getSource();} });'
eval('var controller =' + ajaxAnswer);
但是 controller
未定义。
编辑:
根据答案,我想我需要说得更清楚:
这部分 "{onAfterRendering: function(){}}"
作为字符串来自服务器。我无法从该字符串中删除任何引号。我可以用 JSON.parse()
解析它,但不能解析函数。
根据 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(){}}")
});
我在 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 + ');');
然后让View实例化控制器:
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 returns 无效或 sap.ui.core.mvc.Controller,具体取决于用例。
sap.ui.controller 始终由具有控制器名称的视图实例化。如果您创建 sap.ui.controller("<Insert Name Here>", code Implementation)
您可以使用 sap.ui.controller("<Insert Same Name As Above>")
.
在您的视图中实例化它
是否可以像这样创建一个 sap.ui.controller:
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:
Timothy Groote 更新答案后:
是的,我向服务器发送了一个 AJAX-Call。我现在已经试过了:
var ajaxAnswer = 'sap.ui.controller("testForm", { oView: null, onAfterRendering: function(oEvent){oView = oEvent.getSource();} });'
eval('var controller =' + ajaxAnswer);
但是 controller
未定义。
编辑:
根据答案,我想我需要说得更清楚:
这部分 "{onAfterRendering: function(){}}"
作为字符串来自服务器。我无法从该字符串中删除任何引号。我可以用 JSON.parse()
解析它,但不能解析函数。
根据 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(){}}")
});
我在 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 + ');');
然后让View实例化控制器:
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 returns 无效或 sap.ui.core.mvc.Controller,具体取决于用例。
sap.ui.controller 始终由具有控制器名称的视图实例化。如果您创建 sap.ui.controller("<Insert Name Here>", code Implementation)
您可以使用 sap.ui.controller("<Insert Same Name As Above>")
.