我有一个 ExtJS 5 ViewModel,其中包含一个商店,以及使用 AJAX 代理的 JSON 读取器。
然而,代理的 URL 依赖于绑定(bind),它替代了 ViewModel 数据属性。然而,URL 属性的评估似乎仅在 ViewModel 第一次加载时完成,而不是在数据属性更改时完成。
这段代码应该说明我正在尝试做的事情,尽管为了简洁起见,它缺少部分(扩展语句等)。
我用商店定义我的 View 模型:
Ext.define('sample.ViewModel',{
extend:'Ext.app.ViewModel',
data:{
departmentId:0,
categoryId:0
}
stores:{
myItems:{
autoLoad:false,
fields:['id','name','price'],
proxy:{
type:'ajax',
url:'/items/department/{departmentId}/category/{categoryId}',
reader:{
rootProperty:'data',
successProperty:'success'
}
}
}
}
}
然后是带有网格的 View : (为简洁起见,删除了列等)
Ext.define('sample.View',{
// ....
items:[{
xtype:grid,
bind:'{myItems}'
}]
}
以及一个更改 View 模型数据属性并重新加载存储的 Controller :
Ext.define('sample.ViewController',{
// ...
handleSomeEvent:function(){
var viewModel = this.getViewModel();
var store = viewModel.getStore('myItems');
viewModel.set('departmentId', 3);
viewModel.set('categoryId', 4);
// Desired behavior
store.load();
// Required workaround
viewModel.bind('/items/department/{departmentId}/category/{categoryId}', function(newUrl){
store.load({url: newUrl})
});
}
});
如果 Controller 逻辑中没有“必需的解决方法”,商店/网格总是尝试从/items/department/0/category/0 提取数据(即实例化 ViewModel 时的 ViewModel 数据值)。
我想知道当 ViewModel 数据属性更改时如何强制 ExtJS 重新评估配置属性(即代理 URL)。
提前非常感谢!
最佳答案
您遇到的问题是 ViewModel 在计时器上滴答作响。当您调用 load
时,它不会评估对 set
的调用。如果没有,您将拥有两次绑定(bind)触发器,一次是在设置 departmentId
时,第二次是在设置 categoryId
时。
您可以通过调用 notify
强制 ViewModel 勾选:
viewModel.set('departmentId', 3);
viewModel.set('categoryId', 4);
viewModel.notify();
store.load();
关于javascript - 具有数据绑定(bind) URL 的 ExtJS 存储不会重新评估数据属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26368253/