Javascript 使用“Knockout.js”;加上;束缚的悲哀

Javascript 使用“Knockout.js”;加上;束缚的悲哀,javascript,asp.net-mvc,knockout.js,Javascript,Asp.net Mvc,Knockout.js,我有一个应用程序具有以下设置(或多或少): 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

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

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]));
          }
       }
    };
};
var ObjectVM=函数(数据){
var me=这个;
me.name=ko.observable(data.name);
//设置其他属性
...
我被选为(假);
};
var VM=函数(){
var me=这个;
me.Records=[];
me.Selected=可观测(未定义);
me.Select=函数(rec){
if(rec.hasChanges==未定义){
//附加可编辑功能
ko.可编辑(记录);
}
rec.isSelected(正确);
rec.beginEdit();
如果(me.Selected()!=未定义){
如果(me.Selected().hasChanges()){
me.Selected().rollback();
}
me.Selected().isSelected(false);
me.Selected().commit();
}
me.Selected(rec);
//做一些隐藏/显示表单。。。
};
me.Init=函数(){
$.ajax({。。。,
成功:功能(数据){
对于(变量i=0;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>

记录显示网格(假设它是一个包含5列和10行的表)
名称
我在调用VMs Select Function的表行上有一个单击绑定设置。当Select()未定义时,使用“with”绑定会删除表单,当Select()有记录时,会添加回表单。问题是每次出现这种情况时,我都会丢失验证、选项卡和事件绑定(非KO绑定)应用程序功能完美,但在记录之间更改时会出现一些性能问题,因为它必须重新添加表单、设置验证、ui配置和绑定


有没有办法让表单留在页面上,保留我的绑定和设置,或者每次选择的值发生更改时,我都要被迫处理点击?

目前,带
绑定的
将其内容视为模板,并在带
值的
更改时重新呈现。避免重新呈现的唯一方法是g不得将
一起使用

<div>
   <form id="editRec">
     <label>Name</label>
      <input data-bind="value: Selected().name" />
   </form>
</div>
第三种避免重新呈现并支持
未定义的
值的替代方法是使用Knockout 2.2和
if
绑定(并使用
避免
)。在2.2中,
if
绑定仅在值从一个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-->

名称

您使用的是什么版本的KO?我想我在某个地方读到,在2.2中,目前2.1上不应该再出现这种情况(对此没有积极的看法),我现在就尝试一下,让您知道!@AndrewHitaker在更新中没有骰子,我很有希望:(@jjperezaguinaga我明白你的意思,但我更愿意奖励那些正确回答我问题的人。当我问到切苹果的最佳方法时,我有两个关于更换猫砂的回答……你会怎么做?吃猫砂!开玩笑,我明白你的意思,希望你将来能得到更好的答案:)出于某种原因,使用Selected().name不会填充输入字段的值。自定义绑定基本上就是我当前在选择记录时所做的。请注意,我选择了
Selected().name
,因为
Selected
是一个可观察的对象。是的,这是HTML中的方式,我只是忘记添加()在commentAcutally中,我尝试在没有表单的情况下测试它,只是简单的HTML,它成功了。我会看看我能走多远。谢谢!如果你想这样做,最好使用
Selected()&&Selected().name
。最佳做法是使用
绑定的
不会重新渲染,但我们必须解决这个问题。我制作了一个fork of Knockout(),其中包括一个使用
绑定的
,该绑定在值更改时不会重新渲染。
<!--ko if: Selected-->
<div data-bind="setUpStuff: true">
   <form id="editRec">
     <label>Name</label>
      <input data-bind="value: Selected().name" />
   </form>
</div>
<!--/ko-->