依赖的Observable语法问题

时间:2011-09-23 20:28:29

标签: knockout.js

我的简单'依赖可观察'不会更新,当我给它一个函数的语法,因为turorials说是必需的,我得到一个javascript错误。我只想总结三个可观察的值。

如果我使用

<td>${G1 + G2 + G3}</td>

我得到一个静态显示:当其他输入字段改变时,它不会更新。

如果我使用viewModel.Series,我根本不会显示任何值。 如果将viewModel.Series更改为:this.G1()+ this.G2()我得到一个javascript错误,说G1不是函数。

var initialData = {"DateId":32,"Scores":[{"Alias":"Cap Stocks","G1":129,"G2":123,"G3":222,
var theScores = initialData.Scores;
var viewModel = {scores : ko.observableArray(theScores) };
viewModel.Series = ko.dependentObservable(function() {
    return this.G1 + this.G2 + this.G3;
 }, viewModel);
$(function () {
ko.applyBindings(viewModel); }

这是我的模板绑定,至少显示一些东西

<td> ${Alias}</td>
<td><input data-bind="value: G1"/></td>
<td><input data-bind="value: G2"/></td>
<td><input data-bind="value: G3"/></td>
<td>${G1 + G2 + G3}</td> 

1 个答案:

答案 0 :(得分:2)

在这种情况下,您需要观察G1,G2和G3属性。 observableArray会通知数组本身何时发生更改,但不会通知其项目的各个属性。

您可以使用mapping plugin之类的内容,或使用构造函数自行映射,该构造函数可以接收分数对象或每个属性。

function Score(alias, g1, g2, g3) {
   this.Alias = alias;
   this.G1 = ko.observable(g1);
   this.G2 = ko.observable(g2);
   this.G3 = ko.observable(g3);

   this.Series = ko.dependentObservable(function() {
       return parseInt(this.G1(), 10) + parseInt(this.G2(), 10) + parseInt(this.G3(), 10);
   }, this);
}

然后,映射现有的数组:

var theScores = ko.utils.arrayMap(initialData.Scores, function(score) {
    return new Score(score.Alias, score.G1, score.G2, score.G3);    
});

此处示例:http://jsfiddle.net/rniemeyer/SbFDR/