Knockout.js 使可观察的内部对象成为可观察的

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'

假设我在我的viewModel中有一个名为
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);
您需要为已定义的每个模型执行此操作。这可能会非常乏味,并且取决于模型的性质,很可能会首先挫败插件的主要优点(不必重新定义客户端数据模型)