无法在" Rally.data.wsapi.artifact.Store"

时间:2018-01-30 17:28:43

标签: filter rally

我使用rallymilestonecombobox来显示里程碑。 当我输出到console.log时,我正在选择里程碑并获得正确的值。

当我选择新里程碑时,我会更新过滤器。 过滤器无法在商店中加载或更新。

最初我尝试了filters: myFilters但是在工件中没有用。存储。

当我使用

时它起作用了
"filters:
  [{
    property : 'Milestones',
    operator : 'contains',
    value : myFilters.value
  }],"

但是我没有成功更新更新过滤器" .load"。

Ext.define('CustomApp', {
    extend: 'Rally.app.App',
    componentCls: 'app',
    myStore: undefined,
    storyGrid: undefined,
    storyStore: undefined,

    // Intital Layout
    width: 1600,
    height: 1200,
    items: [{
            xtype: 'container',
            itemId: 'pulldown-container',
            padding: '25,5,5,25',
            layout: {
                type: 'hbox',
            }
        },
        {
            xtype: 'container',
            itemId: 'group-container',
            layout: {
                type: 'hbox',
            },

            items: [{
                    title: 'Stories',
                    xtype: 'container',
                    itemId: 'story-grid-container',
                    padding: '20,5,5,25',
                    layout: {
                        type: 'vbox',
                    }
                },
                {
                    title: 'Story info',
                    xtype: 'tabpanel',
                    itemId: 'story-info-container',
                    padding: '5,5,5,25', //top, right, bottom, left).
                    autoScroll: true,
                    layout: {
                        type: 'vbox',
                    },
                }
            ]
        }
    ],

    launch: function() {
        // Load Releases in ComboBox
        // this._loadReleases();
        this._loadMilestones();
    },

    _loadMilestones: function() {
        // Create Milestone ComboBox
        var milestoneComboBox = {
            xtype: 'rallymilestonecombobox',
            itemId: 'milestone-combo-box',
            fieldLabel: 'Milestones',
            labelAlign: 'right',
            width: 300,
            listeners: {
                ready: this._loadData,
                select: this._loadData,
                scope: this
            }
        };

        this.down('#pulldown-container').add(milestoneComboBox);
    },

    //construct filters for given milestone
    _getMilestoneFilters: function(milestoneValue) {
        var milestoneFilter = Ext.create('Rally.data.wsapi.Filter', {
            property: 'Milestone',
            operation: '=',
            value: milestoneValue
        });

        return milestoneFilter;
    },

    //Get data from rally
    _loadData: function() {
        var selectedMilestoneRef = this.down('#milestone-combo-box').getRecord().get('_ref');
        var myFilters = this._getMilestoneFilters(selectedMilestoneRef);

        console.log(myFilters);

        //if store exists, load new data
        if (this.myStore) {
            this.myStore.setFilter(myFilters);
            this.myStore.load();
        } else {
            //create store
            this.myStore = Ext.create('Rally.data.wsapi.artifact.Store', {
                models: ['User Story', 'Defect'],
                autoLoad: true,
                filters: [{
                    property: 'Milestones',
                    operator: 'contains',
                    value: myFilters.value
                }],
                listeners: {
                    load: function() {
                        this._onStoriesForMilestoneLoad();
                    },
                    scope: this
                },
                fetch: ['FormattedID', 'Name']
            });
        }
    },

    _onStoriesForMilestoneLoad: function() {
        if (!this.down('#my-grid')) {
            var gridListeners = {
                itemclick: {
                    fn: function(record, item) {
                        this._createStoryInfo(record, item);
                        this._createRevisionInfo(record, item);
                    }
                },
                scope: this
            };

            var columnCfgs = ['FormattedID', 'Name'];
            this._createGrid('my-grid', this.myStore, gridListeners, '#story-grid-container', columnCfgs, 600, 775, null);
        }
    },

    _createGrid: function(id, theStore, theListeners, container, theColumnCfgs, gridwidth, gridheight, tabTitle) {
        var storyGrid = {
            title: tabTitle,
            xtype: 'rallygrid',
            itemId: id,
            store: theStore,
            listeners: theListeners,
            context: this.getContext(),
            columnCfgs: theColumnCfgs,
            enableEditing: false,
            showRowActionsColumn: false,
            enableScheduleStateClickable: false,
            verticalScroller: false,
            showPagingToolbar: false,
            width: gridwidth,
            height: gridheight,
            forceFit: true,
        };

        this.down(container).add(storyGrid);
    },
});

2 个答案:

答案 0 :(得分:0)

我看看这个例子: https://help.rallydev.com/apps/2.1/doc/#!/example/filterable-grid

它与您的用例略有不同,但机制仍然相同。 重要的是这个:

var myFilters = this._getMilestoneFilters(selectedMilestoneRef);
if (this.myStore) {
      this.myStore.clearFilter(true);
      this.myStore.filter([myFilters]); //notice, it's an array
}

还有一个应用程序基类,可以很容易地使用timebox作用域,因为它是一个常见的用例:

https://help.rallydev.com/apps/2.1/doc/#!/guide/timebox_filtering

您可以扩展Rally.app.TimeboxScopedApp,将scopeType设置为里程碑并从那里开始。它将为您处理创建里程碑组合。它还将自动支持在Rally中处理里程碑范围的自定义页面。

我认为您可能非常接近现有实施中的工作代码,但值得考虑调查TimeboxScopedApp ......

答案 1 :(得分:0)

我必须专门更新Filter值并且它有效。 我应该知道,因为我必须在创建商店时这样做。

     //if store exists, load new data
     if(this.myStore)
     {
        this.myStore.clearFilter(true);           
        this.myStore.filter([
        {
                property : 'Milestones',
                operator : 'contains',
                value : myFilters.value
        }]);

       this.myStore.load();
     }
     else
     {
        //create store
        this.myStore = Ext.create('Rally.data.wsapi.artifact.Store',
        {