在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');
};
答案 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;
}
};
这是未经测试的。