Knockout.js使用“与”绑定困境(Knockout.js Using “with” Bind

2019-10-17 13:21发布

我有一个具有以下设置(或多或少)的应用程序:

JS

var ObjectVM = function(data) {
    var me = this;
    me.name = ko.observable(data.name);
    //Set other properties
    ...

    me.isSelected(false);
};
var VM = function () {
    var me = this;
    me.Records = [];
    me.Selected = ko.observable(undefined);
    me.Select = function (rec) {
        if (rec.hasChanges == undefined) {
            //attach editable functionality
            ko.editable(record);
        }
        rec.isSelected(true);
        rec.beginEdit();
        if (me.Selected() != undefined) {
            if (me.Selected().hasChanges()) {
                me.Selected().rollback();
            }
            me.Selected().isSelected(false);
            me.Selected().commit();
        }
        me.Selected(rec);
        //Do some hiding/showing of form...
    };
    me.Init = function(){
       $.ajax({...,
          success: function(data){
          for(var i = 0;i< data.length;i++){
           me.Records.push(new ObjectVM(data[i]));
          }
       }
    };
};

HTML

<div>
     RECORDS DISPLAY GRID (Pretend it's a table with 5 columns and 10 rows)
</div>
<div data-bind="with: Selected">
   <form id="editRec">
     <label>Name</label>
      <input data-bind="value: name" />
   </form>
</div>

我有一个点击调用虚拟机选择功能可按表中的行结合设置。 使用“与”选择​​时结合移除形式()是不确定的,选择时添加回()有一个记录。 每当这个发生时,我失去了我的验证,选项卡,并连接到形式事件绑定(非KO绑定)的问题。 应用功能完美,但与记录之间切换时,它是具有重新添加的形式,设置验证,用户界面配置,并绑定一些性能命中。

有没有一种方法来在页面上停留的形式,让我的绑定和设置,还是我将强迫每个选定的值发生改变时应对冲击吗?

Answer 1:

目前with结合治疗其内容为模板,重新呈现任何时间with价值的变化。 避免重新渲染的唯一方法是不使用with

<div>
   <form id="editRec">
     <label>Name</label>
      <input data-bind="value: Selected().name" />
   </form>
</div>

当然,如果Selected有时可undefined ,这是不行的,你必须寻找另一种解决方案。 最好的方法是使用自定义绑定,设置了您的事件处理程序,验证,标签等。

<!--ko with: Selected-->
<div data-bind="setUpStuff: true">
   <form id="editRec">
     <label>Name</label>
      <input data-bind="value: name" />
   </form>
</div>
<!--/ko-->

第三个替代方案,以避免一些重新渲染和还支持一个undefined值是2.2敲除使用和if结合(并避免with )。 在2.2中, if绑定如果数值超出falsy到truthy,但如果它从一个truthy值更改为另一只重新呈现。

<!--ko if: Selected-->
<div data-bind="setUpStuff: true">
   <form id="editRec">
     <label>Name</label>
      <input data-bind="value: Selected().name" />
   </form>
</div>
<!--/ko-->


文章来源: Knockout.js Using “with” Binding woes