javascript - 具有数据绑定(bind) URL 的 ExtJS 存储不会重新评估数据属性

标签 javascript extjs viewmodel

我有一个 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/

相关文章:

javascript - 在 for 循环中从 javascript 选择值

extjs - 如何在 Sencha Touch 应用程序中制作静态标题栏?

css - ExtJs - 在 mixins scss 中覆盖 css

android - 具有 Viewmodel 的 Android 上的 Headless Activity

android - 在 Dagger Dialog Fragment 中使用 View Model Providers(ViewModelProviders)

javascript - 根据查询设置html按钮状态

javascript - 在 javascript 库中的导出类之外声明函数是实现私有(private)函数的好习惯吗?

javascript - datalist如何判断下拉列表中是否选择了输入

extjs - keyup 事件未在文本字段的 setValue() 上触发

javascript - 使用 JavaScript/Knockout 下拉列表中选定的值填充 MVC3 View 模型?