即时创建 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>").

在您的视图中实例化它