我正在使用 KnockoutJS ...
我的 viewModel 中有一部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
属性代表特定于该用户的信息,例如他们的个人评分或他们是否看过电影等。
我让用户能够将电影“添加”到他们在数据库中的集合中。当他们将电影添加到他们的收藏中时,会发回一个 json 响应,其中包含UserMovies
该电影的更新属性。
我正在尝试仅更新该属性,然后将其保留在淘汰赛模板中。这是我当前的视图模型...
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/