内部に多数のネストされた変数を持つ複雑な javascript 変数があり、それぞれに独自のネストされた変数を含めることができます...ノックアウト マッピングを行うと、ネストされた変数がオブジェクトとして設定されることもあれば、まったく同じ変数が関数として設定されることもあります。そのため、これらのネストされた変数へのデータ バインディングが、次に変数が関数になったときにオブジェクトを期待している場合、バインディングは更新されません。
以下のフィドルは、私が見ているもののアイデアを提供します:
http://jsfiddle.net/Eves/AUcGM/2/
html:
<p> <span>Name:</span>
<span data-bind="text: TempData().objectA.Name"></span>
<button id="update" data-bind="click: Update">Update!</button>
</p>
Javascript:
var ViewModel = function (data) {
var me = this;
me.TempData = ko.observable(data);
me.Update = function () {
ko.mapping.fromJS(temp2, {}, me);
};
return me;
};
var temp1 = {
objectA: {
Name: 'temp1.objectA.Name'
}
};
var temp2 = {
objectA: function () {
this.Name = 'temp2.objectA.Name';
return this;
}
};
window.viewModel = ko.mapping.fromJS(new ViewModel(temp1));
ko.applyBindings(window.viewModel);
最初、スパン テキストには「temp1.objectA.Name」が表示されます。ただし、更新ボタンをクリックしてバインディングが temp1 オブジェクトから temp2 オブジェクトに切り替わると、"objectA" が関数になったため、データ バインディングは更新されません。スパンのデータ バインディングを "TempData().objectA().Name" に変更すると、temp2 は正常に機能しますが、temp1 が壊れてしまいます。
質問は次のとおりです。
変数を常にオブジェクトまたは関数として評価する方法はありますか?
関数やオブジェクトに関係なく、常に適切な値を取得するために ko.computed を使用できると思います。しかし、私が実際に扱っているオブジェクトの複雑さを考えると、それは非常に面倒です。