Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 具有数据绑定URL的ExtJS存储未重新评估数据属性_Javascript_Extjs_Viewmodel - Fatal编程技术网

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

Javascript 具有数据绑定URL的ExtJS存储未重新评估数据属性,javascript,extjs,viewmodel,Javascript,Extjs,Viewmodel,我有一个extjs5viewmodel,它包含一个存储,带有一个使用AJAX代理的JSON读取器 但是,代理的URL依赖于绑定,而绑定替代了ViewModel中的数据属性。但是,URL属性的计算似乎仅在第一次加载ViewModel时完成,而不是在数据属性更改时完成 这段代码应该说明我正在尝试做什么,尽管为了简洁起见,它缺少了一些部分(扩展了语句等) 我使用存储定义视图模型: Ext.define('sample.ViewModel',{ extend:'Ext.a

我有一个extjs5viewmodel,它包含一个存储,带有一个使用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.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})
            });
        }
    });
然后是带有网格的视图: (为了简洁起见,删除了列等)

和更改视图模型数据属性并重新加载存储的控制器:

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


非常感谢

您遇到的问题是ViewModel会在计时器上滴答作响。在调用
load
时,对
set
的调用不会进行计算。如果没有,则会有两次绑定触发器,一次是在设置
部门ID
时,第二次是在设置
类别ID

您可以通过调用
notify
,强制ViewModel勾选:

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

太棒了,工作很愉快,非常感谢您的快速回复!有没有办法在不使用Ext中的私有方法的情况下做到这一点?