2015-06-12 3 views
2

Можно ли создать sap.ui.controller так:Создать UI5-контроллер на лету

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

Use-Case, у меня есть сервер, который создает контроллер на лету , если нужно.

Когда я получаю логики как строки и попытаться использовать его так:

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

контроллер всегда неопределенными.

Любые намеки на эту тему?

EDIT 2:

После Тимоти Грут обновленный ответ:
Да, я отправить AJAX-вызов сервера. Я попытался это прямо сейчас:

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

eval('var controller =' + ajaxAnswer); 

Но controller является неопределенным.

EDIT:

Согласно Ответ, я думаю, что мне нужно сделать это еще яснее:

Эта часть "{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 + ');'); 

, а затем пусть 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 возвращается недействительным или sap.ui.core. mvc.Controller, в зависимости от варианта использования.

sap.ui.controller всегда создается экземпляром с именем контроллера. Если вы создаете 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(){}}") 
}); 
Смежные вопросы