0

かなり単純な部分更新をしようとしています。最初は null であるビュー モデルのプロパティ「person」を、独自の子プロパティ「lastName」を持つオブジェクトで更新します。これは、サブスクライバーに通知しようとすると、「no method 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 オブザーバブル ジャンク文字列] にメソッド 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 を呼び出すときのオブザーバブルは言うまでもありません。upadteData を呼び出したときにのみ作成されます。

私は通常、ビュー モデルを空白のオブザーバブルで初期化します。

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 に答える
0

()fromlastNameプロパティを削除するだけです。目に見える性質ではないので

または、コードを編集して、観測可能なプロパティを使用してデータの新しいモデルを定義します

于 2013-06-04T12:50:28.410 に答える