0

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

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

我看到了一个类似的帖子Splicing new array of items to existing Knockout observable array 会导致绑定错误,但它似乎对我不起作用。

查看模型

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/

更新

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

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

4

2 回答 2

0

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

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

小提琴后更新

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

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

于 2013-10-09T17:17:57.113 回答
0

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

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

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

其他可能的方式——

self.otherArray = self.SearchResults().splice(self.CurrentIndex, 1, getjsondata);
于 2013-10-12T14:24:41.717 回答