0

我正在尝试做一个相当简单的部分更新。我使用具有自己的子属性“lastName”的对象更新了视图模型的属性“person”,该属性最初为 null。尝试通知订阅者时,这会失败并显示“没有方法 person.lastName()”。

小提琴演示问题:http: //jsfiddle.net/P4Jd3/4/

HTML

<body>
  <hr/>
  <div data-bind="text: rootdata"></div>
  <hr/>
  <div data-bind="if: person">
    <div data-bind="text: person.lastName()?person.lastName()+'###':'foo'">
    </div>
  </div>
  <hr/>
  <input type="submit" data-bind="click: updatedata" value="update data"></input>
</body>

JS:

newdata = {
    person: {
        lastName: "Mr.Bar"
    },
    rootdata : "Root 2"
}

model = {
    self: this,
    person : ko.observable(null),
    rootdata : ko.observable("Init root"),
    updatedata: function() {
        ko.mapping.fromJS(newdata, {}, model);
    }
}

ko.applyBindings(model);

在更新时,我收到一条错误消息,指出对象函数 [ko observable junk string] 没有方法 lastName()。

Message: TypeError: Object function d(){if(0<arguments.length){if(!d.equalityComparer||!d.equalityComparer(c,arguments[0]))d.H(),c=arguments[0],d.G();return this}b.r.Wa(d);return c} has no method 'lastName';
Bindings value: text: person.lastName()?person.lastName()+'###':'foo' 

需要 person.lastName()+"##" 将属性值与可选的文本格式相结合,具体取决于某些属性是否为非空。

我对这个没有想法。

4

3 回答 3

3

您的 person 对象没有 lastname 属性,更不用说调用 applyBindings 时的 observable。它仅在您调用 upadteData 时创建。

我通常用空白的 observables 初始化我的视图模型:

model = {
    self: this,
    person : ko.observable({ lastName: ko.observable('')}),
    rootdata : ko.observable("Init root"),
    updatedata: function() {
        ko.mapping.fromJS(newdata, {}, model);
    }
}

ko.applyBindings(model);
于 2013-06-04T12:35:13.867 回答
2

这是with绑定的完美用例。如果您替换if: personwith: person,它会简化您的代码并且可以正常工作:

<div data-bind="with: person">
    <div data-bind="text: lastName() ? lastName()+'###' : 'foo'"></div>
</div>

http://jsfiddle.net/mbest/P4Jd3/5/

于 2013-06-04T20:42:50.897 回答
0

只需()lastName属性中删除。因为它不是可观察的属性

编辑您的代码以使用 observables 属性为您的数据定义新模型

于 2013-06-04T12:50:28.410 回答