钛合金:从另一个控制器调用控制器功能

时间:2014-04-29 12:04:49

标签: titanium controllers titanium-alloy

使用SDK 3.2.0

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

//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);

1 个答案:

答案 0 :(得分:3)

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

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

现在你可以在Alloy.Globals.someGlobalFunction();

之类的地方调用该函数