我有一个带有标题和开关的自定义TableViewRow,如下所示:
rowFilter.xml
<TableViewRow id="rowFilter">
<View id="vwItemHeader">
<Label id="lblItemHeader"></Label>
</View>
<View id="vwFilterStatus">
<Switch id="swtFilterStatus" onChange="swtFilterStatusChange"></Switch>
</View>
</TableViewRow>
rowFilter.js
var args = arguments[0] || {};
var swtFilterStatusChange_callback;
initialize();
function initialize() {
// Initialize filter row UI
$.lblItemHeader.text = args.title;
$.swtFilterStatus.value = args.value;
// Callback
swtFilterStatusChange_callback = args.callback;
};
在我称为“浏览”的视图中,我以编程方式添加了以下自定义行:
var args = { title: item.title, value: item.value, callback: swtFilterStatusChanged, };
var newRow = Alloy.createController('rowFilter', args).getView('rowFilter');
这按预期工作。但是现在我想添加一个选中/取消选中所有行。如何以编程方式在自定义行中切换开关?
我尝试在rowFilter.js中创建以下函数(以及用于关闭的类似函数):
exports.toggleOn = function() {
if ($.swtFilterStatus.value == false) {
$.swtFilterStatus.value = true;
swtFilterStatusChange();
}
};
我也尝试过这样:
$.toggleOn = function() {
}
:: EDIT ::这是我处理check / uncheck all开关的方式。
function allSwitch_Change(value) {
$.tblFilters.data[0].rows.forEach(function(row) {
if (value) {
row.toggleOn();
}
else {
row.toggleOf();
}
}
}
然后使用以下命令更改上面做Alloy.createController的Browse.js行:
var newRow = require('rowFilter');
newRow.initialize(args);
但是,我在require语句的行上遇到了一个异常,即“找不到用于体系结构的module:rowFilter:x86_64”。
我在做什么错,我该如何执行检查/取消选中所有行?
最佳答案
您可以执行以下操作:
rowFilter.js
var args = arguments[0] || {};
var swtFilterStatusChange;
initialize();
function initialize() {
// Initialize filter row UI
$.lblItemHeader.text = args.title;
$.swtFilterStatus.value = args.value;
// Callback
swtFilterStatusChange = args.callback;
};
$.on('toggleOn',function(){
if ($.swtFilterStatus.value == false) {
$.swtFilterStatus.value = true;
swtFilterStatusChange();
}
});
browser.js
var args = { title: item.title, value: item.value, callback: swtFilterStatusChanged, };
var newRow = Alloy.createController('rowFilter', args);
newRow.trigger('toggleOn');
实现目标的其他选择:
全局事件-
Ti.App.addEventListener
和Ti.App.fireEvent
。易于实现,但有潜在的内存泄漏。确保删除表行后调用Ti.App.removeEventListener
。从表行的
children
获取开关视图。手动在其上触发事件。将对回调
swtFilterStatusChanged
的引用存储在某个地方,然后再调用它。