动态创建UI5-Controller

时间:2015-06-12 07:10:13

标签: javascript sapui5

是否可以像这样创建 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()解析它,但无法解析函数。

2 个答案:

答案 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的正确方法。 Android Studio compiler options
你应该只是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>")在视图中对其进行实例化。