2015-11-17 2 views
0

Рассмотрим следующий код:Нокаут Еогеасп связывание с функцией

<div class="expandedCoverages" data-bind="foreach: $root.getGroupCoveragesPerPackage(packageCost)"> 
    <div class="calculateCostCoverage" 
     data-bind="html: CoverageGroupDescription()"></div> 
    </div> 
</div> 

Если packageCost наблюдаемые изменения, CoverageGroupDescription() не изменяется, поскольку функция не срабатывает снова.

Возможно ли как-то снова вызвать функцию, чтобы изменить привязку foreach?

+2

Может вы не использовали вычислен наблюдаемым вместо функции? –

+0

предыдущий код находится внутри другого цикла foreach. И я хочу передать переменную packageCost в этом foreach. Как это можно сделать с вычисленным наблюдаемым? – gong

+4

@gong: Это была важная информация для вопроса. Вероятно, мы сможем помочь вам найти способ «KO», если вы можете создать [MCVE] (/ help/mcve) вашей текущей структуры. Скорее всего, это связано с вычисленным наблюдаемым внешним массивом, на котором вы используете 'foreach', но, не видя, что у вас есть, невозможно быть уверенным. –

ответ

1

Под капотом это то, что 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>

Смежные вопросы