以下是公式的配置:
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
我在那里工作。但是,就我个人而言,我会同意西奥的想法,因为深度绑定需要很多开销。
我认为使用公式实际上不可能做到这一点,但可以使用事件。
通过侦听load
、datachanged
和update
事件,可以将存储的任何更改通知您,从这里您可以执行在公式中要执行的操作,并在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)
}
});