【问题标题】:titanium alloy: calling controller function from another controller钛合金:从另一个控制器调用控制器功能
【发布时间】:2014-04-29 12:04:49
【问题描述】:

使用 SDK 3.2.0

我有一个索引控制器,它定义了一个设置 Android 菜单的函数。 我想从整个应用程序中嵌套加载的各种控制器调用该函数。 代码:

//index.js
exports.setMenus = function(enabled) {
        var activity = $.index.getActivity();
        activity.onCreateOptionsMenu = function(e){
           /...
        };
        activity.onPrepareOptionsMenu = function(e) {
           /...
        };
        activity.invalidateOptionsMenu();
}; 
Alloy.Globals.Index = $;

然后,在home controller 内部,我试试这个:

function startRefresh() {
    //...
    Alloy.Globals.Index.setMenus(true); 
}
$.on('focus', startRefresh);

收到以下错误消息:

[ERROR] :  TiExceptionHandler: (main) [1,40482] - In alloy/controllers/home.js:8,29
[ERROR] :  TiExceptionHandler: (main) [0,40482] - Message: Uncaught TypeError: Obje
ct #<Controller> has no method 'setMenus'
[ERROR] :  TiExceptionHandler: (main) [0,40482] - Source:         Alloy.Globals.Ind
ex.setMenus(true);

我已按照this answer 的指示进行操作。我想使用导出,因为调用 setMenus 的控制器不是索引的子级,它们嵌套更深。我的意思是,我试图避免在控制器之间传递参数。

为什么 setMenus 没有被导出?

工作原理:

//index.js
exports.setMenus = function(enabled) {
        var activity = $.index.getActivity();
        //...
}; 
Alloy.Globals.setMenus = setMenus;

//home.js
function startRefresh() {
    //...
    Alloy.Globals.setMenus(true); 
}
$.on('focus', startRefresh);

【问题讨论】:

  • 将exports.setMenus 更改为$.setMenus。这应该可以供将来参考,但 Swanand 的回答是更好的做法。

标签: titanium controllers titanium-alloy


【解决方案1】:

如果您想从各种控制器调用一个函数,那么您可以在alloy.js 中编写该函数 例如:

Alloy.Globals.someGlobalFunction = function(){ alert("Hello"); };

现在你可以在任何地方调用函数,例如Alloy.Globals.someGlobalFunction();

【讨论】:

  • 无法做到这一点。问题是 Android 菜单需要通过一个活动(窗口绑定到)进行设置,并且该活动在控制器内是可访问的。我最终在索引控制器中执行此操作:Alloy.Globals.setMenus = setMenus; 并且它有效。你给了提示,谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 2016-10-08
相关资源
最近更新 更多