Knockout.js 使可观察的内部对象成为可观察的
假设我在我的viewModel中有一个名为Knockout.js 使可观察的内部对象成为可观察的,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,假设我在我的viewModel中有一个名为movies的observearray,其中包含类似于以下内容的数据 [{ Id: 12345, Title: 'Movie1', Year: 2010,, UserMovies: [{ Id: 8 IsWatched: false, Rating: 3.5, UserId: 'e1e9c075-1ded-4e7d-8d30-d5d1fbd47103'
movies
的observearray
,其中包含类似于以下内容的数据
[{
Id: 12345,
Title: 'Movie1',
Year: 2010,,
UserMovies: [{
Id: 8
IsWatched: false,
Rating: 3.5,
UserId: 'e1e9c075-1ded-4e7d-8d30-d5d1fbd47103'
}]
},{
Id: 12345,
Title: 'Movie2',
Year: 2010,,
UserMovies: [{
Id: 11
IsWatched: false,
Rating: 4,
UserId: 'e1e9c075-1ded-4e7d-8d30-d5d1fbd47103'
}]
}]
我知道我可以使用映射插件,每个属性都将成为一个可观察的
,但是如果我只想让一个属性可观察呢。是否可以将UserMovies
设置为一个observearray
,我将如何执行此操作?您可以尝试循环数组中的每个项目,将UserMovies
存储在临时变量中,用一个可观察数组覆盖UserMovies
。大概是这样的:
for (var i = 0; i < movies().length; i++) {
var tempUserMovies = movies()[i].UserMovies;
movies()[i].UserMovies = ko.observableArray();
for (var j = 0; j< tempUserMovies.length; j++) {
movies()[i].UserMovies.push(tempUserMovies[j]);
}
}
for(var i=0;i
这是一个有点难看的方法,但是你应该从中得到大致的想法。你可以在你的对象中指定属性,你希望ko.mapping插件将这些属性映射为普通值,如下所示:
var mapping = {
'copy': ["propertyToCopy"]
}
var viewModel = ko.mapping.fromJS(data, mapping);
您需要为已定义的每个模型执行此操作。这可能会非常乏味,并且取决于模型的性质,很可能会首先挫败插件的主要优点(不必重新定义客户端数据模型)