我想用ko绑定一个简单的结构,但是我在绑定期间遇到异常。 我的VM看起来像这样:
function VM() {
this["longNameObjId1"] = new Object();
this["longNameObjId1"].records = ko.observableArray();
var obj1 = new Object();
obj1.L1 = "a";
obj1.L2 = "b";
obj1.L3 = "c";
this["longNameObjId1"].records.push(obj1);
var obj2 = new Object();
obj2.L1 = "A";
obj2.L2 = "B";
obj2.L3 = "C";
this["longNameObjId1"].records.push(obj2)
}
我正在尝试遍历longNameObjId1属性的 records 数组中的所有对象,并将它们放在表中。我确实需要对记录数组的更改进行一些控制,所以我开始包装foreach流控制,如下所示:
ko.bindingHandlers.dynCollection = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, context){
ko.bindingHandlers.foreach.init(element, valueAccessor, allBindingsAccessor, viewModel, context);
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel, context) {
ko.bindingHandlers.foreach.update(element, valueAccessor, allBindingsAccessor, viewModel, context);
}
};
没什么特别的。在观点方面,我认为应该这样做:
<!-- ko with: longNameObjId1 -->
<table>
<thead>
<tr>
<th style="width: 33%">L1</th>
<th style="width: 25%">L2</th>
<th style="width: 25%">L3</th>
<th style="width: 17%"></th>
<th></th>
</tr>
</thead>
<tbody id="test_tBody" data-bind="dynCollection: records">
<tr>
<td id="test_td1" data-bind="text: L1"></td>
<td id="test_td2" data-bind="text: L2"></td>
<td id="test_td3" data-bind="text: L3"></td>
</tr>
</tbody>
</table>
<!-- /ko -->
在运行时,我可以在浏览器中看到包含预期数据的表。我遇到的问题是我收到的异常是这样的:
Error: Unable to parse bindings.
Message: ReferenceError: L1 is not defined;
Bindings value: text: L1
我很乐意忽略错误,因为我可以在浏览器中看到我的数据,但问题是记录数组没有真正绑定的事实:例如调用 push()显示表格后,从控制台(并忽略错误)不会触发 dynCollection.update()函数。
有人可以指出我的错误在哪里,或者是映射记录数组的更好方法吗?
我在Windows Server 2008 R2 SP1上使用带有FF 20.0的knockout 2.2.1。
如果您需要更多详情,请告诉我
谢谢,
FLO。
更新
在我尝试的一些事情中,使用像这样的上下文属性 $ data :
<td id="test_td1" data-bind="text: $data.L1"></td>
这导致了一个相当意外的行为:错误不再表现出来,但我的表也没有出现:我的页面中有一个空表,但没有错误。必须有一些我绝对不了解绑定的东西。如果有人能够对这一特定行为有所了解,我将不胜感激。感谢。
答案 0 :(得分:0)
只需在return
子广告之前添加foreach.init
:
init: function (element, valueAccessor, allBindingsAccessor, viewModel, context){
return ko.bindingHandlers.foreach.init(element, valueAccessor, allBindingsAccessor, viewModel, context);
},
这会在records
未初始化时停止表格行模板。