Под капотом это то, что Knockout делает с функциями/операторов, выполняемых непосредственно в окне просмотра (HTML):
- Если код не зависит от наблюдаемого, будет оцениваться только один раз.
- Если код зависит от наблюдаемого, он создаст вычисленный наблюдаемый, который будет переоценивать каждый раз, когда наблюдаемые изменения.
Хотя использование вычисленного свойства в модели JS, как предлагает комментарий Сэма Смита, является более чистым, это не является абсолютно необходимым. Выполнение:
<div data-bind="foreach: myFunction(observableParam())"></div>
на самом деле так же, как делают:
<div data-bind="foreach: myComputed"></div>
с:
this.myComputed = ko.computed(function() { return myFunction(observableParam()); });
Это означает, что в данном случае, вероятно, coverageGroupDescription
не возвращает правильно обновленный массив. См. Рабочий пример с более или менее аналогичной реализацией, как в вопросе ниже. Измените packageCost, и описания также будут автоматически изменены.
var Coverage = function(cost) {
this.cost = ko.observable(cost);
this.coverageGroupDescription = function() {
return 'This package costs ' + this.cost() + '$';
}.bind(this);
}
var app = {
items: ko.observableArray([
new Coverage(15),
new Coverage(20),
new Coverage(25),
new Coverage(30),
new Coverage(35),
]),
packageCost: ko.observable(1),
getGroupCoveragesPerPackage: function(m) {
var m = m();
return ko.utils.arrayMap(this.items(), function(item, i) {
return new Coverage(item.cost()*m);
});
}
};
ko.applyBindings(app);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
Multiply all by: <input type="text" data-bind="value: packageCost">
<ul data-bind="foreach: getGroupCoveragesPerPackage(packageCost)">
<li data-bind="text: coverageGroupDescription()"></li>
</ul>
Может вы не использовали вычислен наблюдаемым вместо функции? –
предыдущий код находится внутри другого цикла foreach. И я хочу передать переменную packageCost в этом foreach. Как это можно сделать с вычисленным наблюдаемым? – gong
@gong: Это была важная информация для вопроса. Вероятно, мы сможем помочь вам найти способ «KO», если вы можете создать [MCVE] (/ help/mcve) вашей текущей структуры. Скорее всего, это связано с вычисленным наблюдаемым внешним массивом, на котором вы используете 'foreach', но, не видя, что у вас есть, невозможно быть уверенным. –