【问题标题】:Splicing to update a KO Observable array shows an error拼接更新一个KO Observable数组会报错
【发布时间】:2013-10-16 10:33:30
【问题描述】:

我尝试在使用拼接编辑记录后更新表,但出现如下错误。性别是一个单选按钮。我什至试图删除它,下一个字段显示错误。我在这里做错了什么?

未捕获的 ReferenceError:无法解析绑定。 绑定值:文本:性别 消息:性别未定义

我看到了类似的帖子Splicing new array of items onto existing Knockout observable array causes binding errors,但它似乎对我不起作用。

查看模型

var vmSearchResultsModel = function () 
{
    var self = this;
    self.SearchResults = ko.observableArray([]);  //Holds the results of the search
}

返回可观察数组的数据

"SearchResults": [
{
  "id": 3,
  "name": "Adrian D'Costa",
  "dob": "/Date(-37776600000)/",
  "gender": "M",
  "joindate": "/Date(-37776600000)/"  //<-- this is another issue I need to fix
},
{

  "id": 14,
  "name": "Janet D'Curz",
  "dob": "/Date(-37776600000)/",
  "gender": "F",
  "joindate": "/Date(-37776600000)/"

}
]

拼接

var getjsondata = ko.toJSON(self.SearchResults, ['name', 'gender', 'dob', 'joindate']) // select only what is required to show
console.log(getjsondata);
var obj = JSON.parse(getjsondata);  // convert JSON to JS string
alert(obj[0].gender); //M Male, F Female
self.SearchResults.splice(self.CurrentIndex, 1, obj);  // updates the row that was edited  <-- shows an error here

编辑时的单选按钮绑定

<td> Gender </td>
    <td>
        <input type="radio" id="rdMale" name="Gender" value='M'  data-bind="checked: $root.gender" />   
        <input type="radio" id="rdFemale" name="Gender" value='F' data-bind="checked: $root.gender" />
    </td>

编辑 1 下面的模板显示了当我根据 DOB、JoinDate 搜索一些数据时...

<script type="text/html" id="TmplSearchResults">  
    <tr style="border-bottom: 1px solid #CCC;">
        <td valign="middle" data-bind="text: name"></td>
        <td valign="middle" align="center" data-bind="text: gender"></td>
        <!-- ko if: ($root.SearchByVal() ==="DOB") -->
              <td valign="middle" data-bind="textualDate: dob"></td> 
       <!-- /ko -->

        <!-- ko if: ($root.SearchByVal()==="Join Date") -->
              <td valign="middle" data-bind="textualDate: joindate"></td> 
       <!-- /ko -->
        <td valign="middle" > <img type="image" title="edit" src="images/edit1.png"  data-bind="event:{ click: $root.EditEmpDetails.bind($data, $index())}" /></td>
    </tr>        
</script>

编辑 2

我这样改代码

self.SearchResults().splice(self.CurrentIndex, 1, obj);

现在 Uncaught ReferenceError: Unable to parse bindings。绑定值:文本:性别消息:性别未定义错误未显示,但行未随更改而更新。我哪里错了?

编辑 3

Jfiddle http://jsfiddle.net/7LYad/1/

更新

这个小提琴没有任何错误,但没有发生拼接,也没有更新 observables。我哪里错了。我应该有两种视图模型,一种用于显示网格,一种用于保存,一种用于编辑、保存和拼接?

http://jsfiddle.net/7LYad/2/

【问题讨论】:

  • 一个 jsfiddle 会很好。但我认为你不需要$root。只需绑定性别。
  • 更新了我的问题。我使用 $root 作为数据在表格上显示一次。编辑行将显示要编辑的屏幕。然后保存应该更新已编辑但不更新的行
  • 我删除了 $root 但仍然显示该错误。我不太确定如何创建一个 jsfiddle 来复制我的问题。但我认为第三个参数 obj 是一个数组,这可能会导致问题
  • 这是错误 - Uncaught ReferenceError: Unable to parse bindings。绑定值:文本:性别消息:性别未定义
  • 我在编辑 2 中添加了我所做的更改。现在该错误未显示,但该行未更新

标签: c# knockout.js


【解决方案1】:

您的问题与您的拼接无关:$root.gender 告诉 Knockout 查找名为 gender 的属性,它是 ViewModel 的属性(即您在 ko.applyBindings 中指定的属性)本身; $root 限定符总是指 VM 的顶层。显然,您的虚拟机上没有这样的属性;相反,它是 SearchResults 中对象的属性。

如果您有问题的 HTML 包含在带有 foreach: SearchResults 绑定的内容中(或者它在使用 foreachdata 选项调用的模板中),那么只需删除限定符并只写“性别”。

小提琴后更新

1) 您永远不会在主视图模型中将 EditEmployee 设置为真值,因此用于编辑员工的字段永远不会显示。

2) 在 SaveEmpDetails 中,您尝试将对象的 JSON 字符串表示形式(而不是对象本身)拼接到 SearchResults 中。

【讨论】:

  • 实际上它在那里,但我声明它的方式是错误的。在 SearchResults 中是一个具有性别的可观察数组,在外面我将性别声明为一个可观察的,它将保存编辑的值。这是错误的,不知道我该怎么做,任何建议
  • 我已经更新了我的第二把小提琴,现在编辑部分显示了,但拼接仍然是一个问题。我试过 PW Kad 的小提琴,但还是有问题
  • 我了解您的 cmets,但不知道该怎么做。让我继续努力。我也尝试了两种不同的视图模型,这甚至导致了更大的问题
【解决方案2】:

http://jsfiddle.net/7LYad/5/

当你在拼接一个 Knockout observableArray 时你不想拼接数组的值,你想拼接底层数组本身。确保在尝试更改值时不要“获取” observableArray 的值,除非您打算将其设置为等于其他值 -

self.SearchResults.splice(self.CurrentIndex, 1, getjsondata);

其他可能的方式 -

self.otherArray = self.SearchResults().splice(self.CurrentIndex, 1, getjsondata);

【讨论】:

  • 我厌倦了你的小提琴。当我单击编辑链接并进行更改并保存时,会删除已编辑的行并显示此错误 - Uncaught ReferenceError: Unable to parse bindings。绑定值:文本:性别消息:性别未定义
  • 你想做什么?我无法重写你的整个代码,我试图向你展示正确的语法来使用。你想让你的代码做什么???
  • 感谢您的帮助。我要做的就是,当我保存时,我希望该行使用新值进行更新。再次感谢
猜你喜欢
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
  • 2022-09-30
相关资源
最近更新 更多