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');

实现目标的其他选项:

  1. 全局事件 - Ti.App.addEventListenerTi.App.fireEvent。易于实现,但有潜在的内存泄漏。确保在删除 table 行后调用 Ti.App.removeEventListener

  2. 从 table 行的 children 获取切换视图。手动触发事件。

  3. 在某处存储对回调 swtFilterStatusChanged 的引用,稍后调用它。