Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.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 viewmodel数据更改时,Extjs绑定的html不更新_Javascript_Extjs_Mvvm_Data Binding - Fatal编程技术网

Javascript viewmodel数据更改时,Extjs绑定的html不更新

Javascript viewmodel数据更改时,Extjs绑定的html不更新,javascript,extjs,mvvm,data-binding,Javascript,Extjs,Mvvm,Data Binding,我有一个视图,它将html配置绑定到我的viewmodel中的数据 景色 最初呈现视图时,绑定的数据会按预期填充到HTML配置中 然后,我在viewcontroller中创建了一个方法来增加日期 视图控制器 我确信这会导致facepalm时刻,但我希望当我更新viewmodel中的selectedDate数据时,它会触发html配置的两个绑定部分进行更新,但事实并非如此 viewmodel数据肯定正在更新。如果在第二次单击增量按钮时检查viewcontroller中的dateChange变量,您

我有一个视图,它将html配置绑定到我的viewmodel中的数据

景色 最初呈现视图时,绑定的数据会按预期填充到HTML配置中

然后,我在viewcontroller中创建了一个方法来增加日期

视图控制器 我确信这会导致facepalm时刻,但我希望当我更新viewmodel中的
selectedDate
数据时,它会触发html配置的两个绑定部分进行更新,但事实并非如此

viewmodel数据肯定正在更新。如果在第二次单击增量按钮时检查viewcontroller中的
dateChange
变量,您将看到日期确实增加了

在更新绑定配置时,我是否缺少一些东西


我有这个。

更新:您需要@user2767141编写的深度绑定,而不是我建议的丑陋的解决方法


一旦我换了台词:

vm.set('selectedDate', dateChange);
致:


它可以工作。

实际上,你需要深度绑定

参考:

有时,如果对象的任何属性发生更改,可能需要通知您


太棒了,谢谢。为什么创建新的日期实例会改变这一点?
dateChange
不是已经是一个日期实例了吗?是的,但是您现在分配一个新实例,这样绑定机制就可以识别日期已经更改了。我不确定这是不是最好的解决方案:-)明白了。即使这不是最好的解决方案,但它仍然有效,这正是我所需要的:)谢谢你的帮助!一般来说,这是一个糟糕的解决方案:正确的解决方案是在另一个答案中所评论的深度bingind。只有当
数据
中的变量发生更改时(观察者模式),绑定才会更新。如果要在子字段更新时更新,则必须使用
deep:true
Ext.define('MyApp.MyViewModel',{
    extend: 'Ext.app.ViewModel',
    alias: 'viewmodel.myviewmodel',

    data:{
        selectedDate: new Date()
    },
    formulas:{
        currentMonth: function (get){
            var monthNames = ["January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December"];
            var monthNumber = get('selectedDate').getMonth();
            return monthNames[monthNumber];
        }
    }

});
Ext.define('MyApp.MyViewController',{
    extend: 'Ext.app.ViewController',
    alias: 'controller.myviewcontroller',

    onIncrementMonth: function (){
        var vm = this.getViewModel();
        var dateChange = vm.get('selectedDate');

        dateChange.setMonth(dateChange.getMonth() + 1);

        vm.set('selectedDate', dateChange);
    }
});
vm.set('selectedDate', dateChange);
vm.set('selectedDate', new Date(dateChange));
viewModel.bind({
     bindTo: '{someObject}',
     deep: true
 },
 function (someObject) {
     // called when reference changes or *any* property changes
 });