我有一个淘汰模板:
<script type="text/javascript" id="myList">
// template stuff here
</script>
我使用foreach
选项调用它:
<div data-bind="template: { name:'myList', foreach: ItemList }"></div>
我从我的控制器获取视图模型并使用以下Javascript来绑定它:
var viewModel = ko.mapping.fromJS(@Html.Raw(JsonConvert.SerializeObject(Model));
ko.applyBindings(viewModel, document.getElementById("contentsDetails"));
我从控制器返回一些项目,一切都很好。
我的问题是,如果我添加到我的可观察数组
var itemToAdd = {
Name: ko.observable("name a"),
Desc: ko.observable("desc a")
}
viewModel.MyObservableArray().push(itemToAdd);
我已经使用以下方法检查了数组:
console.log(ko.isObservable(viewModel.MyObservableArray));
它不会通过将新项目添加到列表来更新UI模板。
我在这里做错了什么?
答案 0 :(得分:6)
这一行:
viewModel.MyObservableArray().push(itemToAdd);
通过在MyObservableArray
之后添加括号,您可以访问底层数组,并直接将值推入其中。淘汰赛没有看到这种变化。而是直接在.push
:
observableArray
viewModel.MyObservableArray.push(itemToAdd);
这是淘汰赛中的一种方法,它将更新基础数组和通知任何订阅者更改,并将导致UI更新。
或者,你可以保留它,但是告知敲门声它已经改变,这将触发更新:
viewModel.MyObservableArray().push(itemToAdd);
viewModel.MyObservableArray.valueHasMutated();