在父选择上选择项目子项

时间:2012-10-08 20:34:30

标签: sdk rally

我正在为Rally自定义应用程序实现项目选择器,并且当从选择器中选择父项时,我想自动选择项目子项。我能够获取我想要选择的对象的ObjectID和Name,但似乎无法从选择器中选择它们。我尝试使用“fireEvent”方法,但没有成功。这是我到目前为止所做的:

var teamPick = this.down('#filterPanel').add({
    xtype: 'rallymultiobjectpicker',
    id: 'teams',
    modelType: 'project',
    fieldLabel: 'Teams',
    listeners: {
        select: function(field, selected) {
            Ext.create('Rally.data.WsapiDataStore', {
                autoLoad: true,
                fetch: [ 'Name', 'ObjectID' ],
                filters: [
                    { property: 'Parent.ObjectID', value: selected.ObjectID }
                ],
                model: 'Project',
                listeners: {
                    load: function(store, data) {
                        Ext.Array.each(data, function(child) {
                            console.log(child.get('Name')); //Logs the child name
                        });
                    }
                }
            });
        },
        scope: this
    }
});

2 个答案:

答案 0 :(得分:0)

您使用的是2.0p3吗?在MultiObjectPicker中未正确触发事件存在已知问题。这应该在2.0p4中解决。我在2.0p4应用程序中运行了您的代码,它按预期运行。

作为旁注,您的子项目查询也可以这样写:

filters: [
    { property: 'Parent', value: '/project/' + selected.ObjectID }
]

该组件的2.0p4版本还添加了一个名为selectionchange的新事件,它为您提供了当前所选值的数组(因为它是一个多选选择器)。选择/取消选择特定项目时会激活单独的选择和取消选择事件。

答案 1 :(得分:0)

我能够在不使用fireEvent方法的情况下完成此任务。相反,我使用了getValue和setValue方法,并将子项目手动添加到状态:

    this.down('#filters').add({
        xtype: 'rallymultiobjectpicker',
        id: 'teams',
        modelType: 'project',
        listeners: {
            blur: function() { this.down('#teams').collapse(); },
            select: function(field, selected) {
                Ext.create('Rally.data.WsapiDataStore', {
                    autoLoad: true,
                    fetch: [ 'Name', 'ObjectID' ],
                    filters: [
                        { property: 'Parent.ObjectID', value: selected.ObjectID }
                    ],
                    model: 'Project',
                    listeners: {
                        load: function(store, data) {
                            var selected = this.down('#teams').getValue();
                            Ext.Array.each(data, function(child) {
                                selected.push(child.data);
                            });
                            this.down('#teams').setValue(selected);
                        },
                        scope: this
                    }
                });
            }
            scope:    this
        }
    });