如何在商店过滤功能中获取viewModel对象?

问题描述 投票:2回答:2

我定义了商店和过滤器。 ViewModel包含我需要通过此对象过滤商店项目的test对象。

Ext.define('XXX.view.XXX.ViewXXXXModel', {
    extend: 'Ext.app.ViewModel',

...

    stores: {
        agreements: {
            source: 'XXX',
            filters: {
                filterFn: function(item) {
                    return item.some_field !== this.get('test').somevalue;
                }
            }
        }
    }

我无法从过滤功能访问View Model的测试对象?

extjs filtering store
2个回答
4
投票

现在太迟了,但我只是遇到了同样的问题,更简洁的方法是将filterFn作为公式绑定返回:

对于您的原始示例:

stores: {
    agreements: {
        source: 'XXX',
        filters: [{
            filterFn: '{storeFilter}'
            }]
        }
    }
},
formulas: {
   storeFilter: function(get) {
        var somevalue = get('test').somevalue;
        return function(item) {
            return item.some_field !== this.get('test').somevalue;                
        };
   }
}

编辑:当我最初写这篇文章时,我不知道Ext在使用setFilters时不断添加额外的过滤器而不是仅仅替换它们。要解决此问题,您需要使用id命名过滤器。在上面的例子中是这样的:

        filters: [{
            id: 'myVMFilterFunction',
            filterFn: '{storeFilter}'
            }]

然后它按预期替换过滤器


3
投票

理想情况下,在大多数情况下,您将使用声明性过滤器格式 - 粒度确保绑定更具体,在数据更改时触发适当/预期的更新。例如:

stores: {
    agreements: {
        source: 'XXX',
        filters: {
            property: 'some_field',
            value: '{test.somevalue}',
            operator: '!='
        }
    }
}

如果您真的想使用命令式代码,可以通过以下公式注入视图模型范围:

formulas: {
    _this: function(){
        return this;
    }
}

然后像这样绑定它:

stores: {
    agreements: {
        source: 'XXX',
        filters: {
            scope: '{_this}',
            filterFn: function(item){
                return item.some_field !== this.get('test.somevalue'));
            }
        }
    }
}

这有点像kludge,但test的变化可能不会反映在商店和任何视觉组件上。在这种情况下,您最终必须手动重新加载存储或重新应用过滤器 - 这种方式会破坏MVVM的重点。

© www.soinside.com 2019 - 2024. All rights reserved.