我的viewModel由带有可观察元素的可观察数组组成。
// viewmodel
var viewModel = function () {
this.o = ko.observableArray();
for (var i = 0; i < 3; i++)
this.o.push(ko.observable(0));
};
我需要更改这些元素的值。为此我创建了组件。简单的例子如下:
//custom element <component>
ko.components.register("component", {
viewModel: function (params) {
var self = this;
this.value = params.value;
console.log("init component");
this.i = 1;
this.change = function () {
self.value(self.i++);
console.log("change to " + self.value());
}
},
template: "<span data-bind='text: value'></span> <button data-bind='click:change'>Change</button>"
});
此组件可以更改params.value中的observable元素的值。
我的观点很简单:
<!--ko foreach:o-->
<component params="value: $rawData"></component>
<!--/ko-->
完整示例:http://jsfiddle.net/tselofan/xg16u5cg/7/ 问题是当可观察数组中的可观察元素的值发生更改时,组件会再次呈现,因为它位于foreach绑定中。您可以在日志中看到这一点。在这种情况下我可以使用哪种最佳做法?谢谢
答案 0 :(得分:1)
每次数字更改时都会重新创建组件,因为组件的上下文是数字。
http://jsfiddle.net/Crimson/xg16u5cg/8/
<!-- ko foreach: o -->
<component params="value: $data.myNumber"></component>
<!-- /ko -->
//Test how components work in foreach binding
//custom element <component>
ko.components.register("component", {
viewModel: function (params) {
var self = this;
this.value = params.value;
console.log("init component");
this.i = 1;
this.change = function () {
self.value(self.i++);
console.log("change to " + self.value());
}
},
template: "<span data-bind='text: value'></span> <button data-bind='click:change'>Change</button>"
});
// viewmodel
var viewModel = function () {
this.o = ko.observableArray();
for (var i = 0; i < 3; i++)
this.o.push({myNumber: ko.observable(0)});
};
ko.applyBindings(new viewModel());
答案 1 :(得分:1)
Knockout-Repeat(https://github.com/mbest/knockout-repeat)是一个迭代绑定,不会创建新的绑定上下文,并且具有foreach
模式,因此它应该像您期望的那样使用组件。