我有一个带有标题和开关的自定义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.addEventListenerTi.App.fireEvent。易于实现,但有潜在的内存泄漏。确保删除表行后调用Ti.App.removeEventListener
从表行的children获取开关视图。手动在其上触发事件。
将对回调swtFilterStatusChanged的引用存储在某个地方,然后再调用它。

10-07 22:00