0

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

我仍在使用 Titanium SDK 1.7.5,因为升级到较新版本时遇到问题。

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

应用程序.js

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

var module = require('scanView');

module.createScanPage(win);

扫描视图.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;
};

扫描控制器.js

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

1 回答 1

0

虽然循环引用应该与 CommonJS 一起工作(这个线程建议它)我个人避免使用它们,因为你可能会得到意想不到的结果,最重要的是使用 Titanium 和不同的平台。

您可以使用回调或事件侦听器,在您的情况下都可以。

这是回调解决方案的示例:

扫描视图.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;
         }
     });
});

扫描控制器.js

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


编辑:
要使任何模块都可以使用 setText,您可以设置一个全局 eventListener。(我知道有些人认为这是不好的做法,主要是因为可能存在内存泄漏,但如果你在你身后清理它是一个有价值的特性)。

应用程序.js

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


扫描控制器.js

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


扫描视图.js

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

这是未经测试的。

于 2013-11-13T10:21:32.030 回答