私はKnockoutJSを使用しています...
observableArray
ビューモデルに映画があります。ユーザーがタイトルで映画を検索すると配列が更新されるため、配列にプッシュされる典型的な json 応答は次のようになります...
{data : [{
Id: 12345,
Title: 'Movie1',
Year: 2010,
Character: [{
Name: 'Character1',
Person: { Id: 1, Name: 'Person1' }
},{
Name: 'Character2',
Person: { Id: 2, Name: 'Person2' }
}],
UserMovies: [{
Id: 8
IsWatched: false,
Rating: 3.5,
UserId: 'e1e9c075-1ded-4e7d-8d30-d5d1fbd47103'
}]
}]}
各映画のUserMovies
プロパティは、個人的な評価や映画をまだ見たかどうかなど、そのユーザーに固有の情報を表します。
ユーザーがデータベースのコレクションに映画を「追加」できるようにします。UserMovies
映画をコレクションに追加すると、その映画の更新されたプロパティを持つ json 応答が返されます。
そのプロパティだけを更新して、ノックアウト テンプレートに保持しようとしています。これが私の現在のビューモデルです...
function viewModel() {
// private properties
var self = this;
// public properties
self.movies = ko.observableArray([]);
self.searchValue = ko.observable();
// public operations
self.search = function () {
self.isLoading(true);
$.getJSON(arguments[0].action, { name: this.searchValue() }, function (data) {
self.movies(data);
});
};
self.add = function (movie) {
$.ajax({
type: 'POST',
url: arguments[1].currentTarget.attributes[1].value,
data: JSON.stringify({ movie: movie }),
contentType: 'application/json',
dataType: 'json',
success: function (data) {
// how to just update UserMovies property and persist to template for the given movie?
}
});
};
}
ko.applyBindings(new viewModel());
プロパティを更新する方法はわかりませんが、データをノックアウト テンプレートに永続化する限り、UserMovies
各ムービーのプロパティ自体は監視可能ではないため、更新されてもテンプレートで何も自動的に変更されないためだと思います。
すべてのプロパティを監視可能にするマッピングプラグインについて読んでいます。これで持続性の問題が解決するかもしれませんが、マッピング プラグイン内にあるか、マッピング プラグイン経由UserMovies
であるかにかかわらず、プロパティだけを更新する方法がまだわかりません。observableArray
アップデート
マッピング プラグインを使用してフィドルを作成しました。プロパティだけでなくムービー全体を返すとUserMovies
、配列内の項目の更新がはるかに簡単になります。私はそれを機能させるのにいくつか問題があり、UserMovies
プロパティに対する「キー」のマッピングを作成する方法を理解するのに苦労しています。http://jsfiddle.net/cmBd9/3/