【问题标题】:Extjs bound html not updating when viewmodel data is changed更改视图模型数据时,Extjs 绑定的 html 不更新
【发布时间】:2015-12-24 07:11:23
【问题描述】:

我有一个视图,它的 html 配置绑定到我的视图模型中的数据。

景色

Ext.define('MyApp.MyView',{
    extend: 'Ext.Panel',
    renderTo: Ext.getBody(),
    height: 300,
    controller: 'myviewcontroller',
    viewModel:{
        type: 'myviewmodel'
    },

    title: 'Testing formula updates',
    bind:{
        html: 'Date: <b>{selectedDate}</b>, <br />Month: <b>{currentMonth}</b>'
    },

    bbar:[
        {xtype: 'button', text: 'Increment Month', handler: 'onIncrementMonth'}
    ]
});

视图模型

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];
        }
    }

});

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

然后我在视图控制器中创建了一个方法来增加日期。

视图控制器

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

我确定这会导致脸大的时刻,但我期待当我在我的视图模型中更新 selectedDate 数据时,它应该触发我的 html 配置的两个绑定部分进行更新,但事实并非如此。

viewmodel 数据肯定在更新。如果您在第二次单击递增按钮时检查视图控制器中的dateChange 变量,您会看到日期确实增加了。

就更新绑定配置而言,我是否缺少什么?

我有这个here in a fiddle

【问题讨论】:

    标签: javascript extjs mvvm data-binding


    【解决方案1】:

    实际上,您需要 Deep Binding。

    参考: http://docs.sencha.com/extjs/6.0/6.0.0-classic/#!/api/Ext.app.ViewModel.

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

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

    【讨论】:

      【解决方案2】:

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


      一旦我换了行:

      vm.set('selectedDate', dateChange);
      

      收件人:

      vm.set('selectedDate', new Date(dateChange));
      

      有效。

      【讨论】:

      • 非常感谢。为什么创建一个新的日期实例会改变这一点? dateChange 不是已经是一个日期实例了吗?
      • 是的,但是您现在分配了一个新实例,这样绑定机制就可以识别日期已更改。我不太确定这是最好的解决方案:-)
      • 明白了。即使它不是最好的解决方案,它也可以工作,这就是我所需要的 :) 感谢您的帮助!
      • 一般来说,这是一个糟糕的解决方案:P 正确的解决方案是在其他答案中评论的深度 bingind。绑定仅在data 中的变量发生更改时更新(观察者模式)。如果您想在子字段更新时进行更新,则必须使用 deep: true
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多