How to bind correctly a formula with a store in Sencha ExtJs



以下是公式的配置:

formulas: {
    //this binding with the store did not work :(
    countDeactivatedVehicles: {
        bind: {
            bindTo: "{organizationCars}",
            deep: true,
        },
        get: function (store) {
            return store.query("isCarActive", false).getCount();
        }
    }
}

(目前,我们想要的计数最初只显示一次,这意味着加载时工作正常)

当商店组织内的模型Cars更新了属性时,绑定不起作用,商店不会收到其模型已更新的警报。

理想情况下应该发生的是,当模型更新时,事件会传播到商店,以便商店知道发生了更改。通过这种方式,绑定将起作用(?),并且公式将被计算出来。

深度绑定,没有绑定那么深。

以下是您问题的答案:Fiddle

我在那里工作。但是,就我个人而言,我会同意西奥的想法,因为深度绑定需要很多开销。

我认为使用公式实际上不可能做到这一点,但可以使用事件。

通过侦听loaddatachangedupdate事件,可以将存储的任何更改通知您,从这里您可以执行在公式中要执行的操作,并在ViewModel上手动设置。

这把小提琴最好地展示了解决方案:https://fiddle.sencha.com/#view/editor&小提琴/1qvf

Store

Ext.define('Fiddle.Store', {
    extend: 'Ext.data.Store',
    alias: 'store.test',
    listeners: {
        load: 'storeUpdate',
        update: 'storeUpdate',
        datachanged: 'storeUpdate'
    },
    fields: [{
        name: 'include',
        type: 'bool'
    }]
});

ViewModel

Ext.define('Fiddle.StoreBinderViewModel', {
    extend: 'Ext.app.ViewModel',
    alias: 'viewmodel.storebinder',
    stores: {
        teststore: {
            type: 'test'
        }
    },
    data: {
        includedTotal: 0
    }
});

控制器

Ext.define('Fiddle.StoreBinderController', {
    extend: 'Ext.app.ViewController',
    alias: 'controller.storebinder',
    storeUpdate: function (store) {
        var recs = store.query('include', true);
        this.getViewModel().set('includedTotal', recs.length)
    }
});

最新更新