具有数据绑定 URL 的 ExtJS 存储不重新评估数据属性

Posted

技术标签:

【中文标题】具有数据绑定 URL 的 ExtJS 存储不重新评估数据属性【英文标题】:ExtJS store with data-bound URL not re-evaluating data properties 【发布时间】:2014-10-14 18:56:34 【问题描述】:

我有一个 ExtJS 5 ViewModel,其中包含一个商店,以及一个使用 AJAX 代理的 JSON 阅读器。

然而,代理的 URL 依赖于绑定,它替代了 ViewModel 数据属性。然而,URL 属性的评估似乎只在 ViewModel 首次加载时完成,而不是在数据属性更改时完成。

为了简洁起见,这段代码应该说明我正在尝试做的事情,尽管它缺少部分(扩展语句等)。

我用商店定义我的视图模型:

    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'
                        
                       
                
            
    

然后是一个带有网格的视图: (为简洁起见,删除了列等)

    Ext.define('sample.View',
        // ....
        items:[
            xtype:grid,
            bind:'myItems'
        ]

    

以及更改视图模型数据属性并重新加载商店的控制器:

    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)
            );
        
    );

如果控制器逻辑中没有“必需的解决方法”,存储/网格总是会尝试从 /items/department/0/category/0 中提取数据(即 ViewModel 实例化时的 ViewModel 数据值)。

我想知道当 ViewModel 数据属性发生变化时,如何强制 ExtJS 重新评估配置属性(即代理 URL)。

提前非常感谢!

【问题讨论】:

【参考方案1】:

您遇到的问题是 ViewModel 在计时器上滴答作响。当您调用 load 时,它不会评估对 set 的调用。如果没有,您将有两次绑定触发器,一次是在您设置 departmentId 时,第二次是在您设置 categoryId 时。

您可以通过调用notify 来强制 ViewModel 打勾:

viewModel.set('departmentId', 3);
viewModel.set('categoryId', 4);
viewModel.notify();
store.load();

【讨论】:

太棒了,辛苦了,非常感谢您的快速回复! 在 Ext 中不使用私有方法的任何方法?

以上是关于具有数据绑定 URL 的 ExtJS 存储不重新评估数据属性的主要内容,如果未能解决你的问题,请参考以下文章

当我重新加载网格和存储时,extjs 缓存具有相同名称的图片

store.load 后的 Extjs 网格选择有不正确的数据

在 extjs 中如何将存储数据绑定到网格

ExtJS:重新加载数据存储而不重绘网格

无法在Ext.grid.PagingToolbar Extjs上绑定存储

ExtJs Gridpanel 存储刷新