模块内的访问属性(CommonJS样式)

时间:2013-11-12 22:15:53

标签: javascript titanium titanium-mobile appcelerator-mobile commonjs

在Appcelerator Titanium中,我正在创建一个最初设置为某些文本的标签。然后我添加一个按钮,单击该按钮调用scanController模块,该模块需要更改该文本。因此,在scanController中,我在scanView模块中调用setResultTxt()方法,如下所示。但是,当它这样做时它表示myResultTxt为空!那是为什么?

我仍在使用Titanium SDK 1.7.5,因为我无法升级到更新版本。

这是问题的完整工作示例:

app.js

var win = Titanium.UI.createWindow({  
    backgroundColor:'#fff',
    layout:"vertical"
});
win.open();

var module = require('scanView');

module.createScanPage(win);

scanView.js

var myResultTxt, theButton;

exports.createScanPage = function(theWindow) {
    myResultTxt = Ti.UI.createLabel({
        text: 'Some initial text',
        top:40,
    });
    theWindow.add(myResultTxt);

    theButton = Ti.UI.createButton({
        title: 'Do something',
        top:20
    });
    theButton.addEventListener('click', function() {
        alert('clicked');
        var b = require('scanController');
        b.startScanning();
    });
    theWindow.add(theButton);
};

exports.setResultText = function(str) {
    myResultTxt.text = str;
};

scanController.js

exports.startScanning = function() {
    var a = require('scanView');
    a.setResultText('My new text');
};

1 个答案:

答案 0 :(得分:0)

虽然循环引用与CommonJS(This thread suggests it)一起使用,但我个人会避免使用它们,因为您可能会得到意想不到的结果,最重要的是使用Titanium和不同的平台。

您可以使用回调或eventListeners,或者在您的情况下使用。

以下是回调解决方案的示例:

<强> scanView.js

theButton.addEventListener('click', function() {
     var b = require('scanController');
     // You could pass an existing function as well 
     b.startScanning(function(response) {
         if(response && response.text) {
             myResultTxt.text = response.text;
         }
     });
});

<强> scanController.js

exports.startScanning = function(callback) {
    callback({ text:'My new text'});
};


修改
要从任何模块提供setText,您可以设置全局eventListener。 (我知道有些人会考虑这种不好的做法,主要是因为可能存在内存泄漏,但如果你在后面清理它是一个很有价值的功能)。

<强> app.js

Ti.App.addEventListener('app:setScanText', module.setResultText);


scanController.js

exports.startScanning = function() {
    Ti.App.fireEvent('app:setScanText', { text: 'My new text' });
};


scanView.js

exports.setResultText = function(response) {
    if(response && response.text) {
        myResultTxt.text = response.text;
    }
};

这是未经测试的。