Appcelerator - 自定义 TableViewRow 中开关的编程切换
Appcelerator - Programmatic Toggle of Switch in Custom TableViewRow
我有一个带有标题和开关的自定义 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');
这按预期工作。但是现在我想添加一个 check/uncheck all 行。如何以编程方式切换自定义行中的开关?
我尝试在 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();
}
}
}
然后将上面的 Browse.js 行更改为 Alloy.createController,如下所示:
var newRow = require('rowFilter');
newRow.initialize(args);
但是我在 require 语句的行上得到了一个异常 "Couldn't find module:rowFilter for architecture: x86_64"。
我做错了什么以及如何实现 check/uncheck 全部行?
你可以这样做:
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
。易于实现,但有潜在的内存泄漏。确保在删除 table 行后调用 Ti.App.removeEventListener
。
从 table 行的 children
获取切换视图。手动触发事件。
在某处存储对回调 swtFilterStatusChanged
的引用,稍后调用它。
我有一个带有标题和开关的自定义 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');
这按预期工作。但是现在我想添加一个 check/uncheck all 行。如何以编程方式切换自定义行中的开关?
我尝试在 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();
}
}
}
然后将上面的 Browse.js 行更改为 Alloy.createController,如下所示:
var newRow = require('rowFilter');
newRow.initialize(args);
但是我在 require 语句的行上得到了一个异常 "Couldn't find module:rowFilter for architecture: x86_64"。
我做错了什么以及如何实现 check/uncheck 全部行?
你可以这样做:
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
。易于实现,但有潜在的内存泄漏。确保在删除 table 行后调用Ti.App.removeEventListener
。从 table 行的
children
获取切换视图。手动触发事件。在某处存储对回调
swtFilterStatusChanged
的引用,稍后调用它。