使observableArray中的内部对象成为可观察的

时间:2012-12-18 21:50:36

标签: knockout.js knockout-mapping-plugin

假设我的viewModel中有一个名为observableArray的{​​{1}},其中包含与此类似的数据...

movies

我知道我可以使用映射插件,并且每个属性都将成为[{ 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' }] }] ,但如果我只想使一个属性可观察,该怎么办呢。是否可以只observable UserMovies,我将如何做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以在对象中指定希望ko.mapping插件映射为普通值的属性,如下所示:

var mapping = {
    'copy': ["propertyToCopy"]
}
var viewModel = ko.mapping.fromJS(data, mapping);

您需要为已定义的每个模型执行此操作。它可能非常繁琐,并且取决于您的模型的性质,可能首先打败插件的主要好处(不必重新定义您的数据模型客户端)。

答案 1 :(得分:0)

您可以尝试循环数组中的每个项目,将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]);
        }
    }

有点丑陋的方法,但你应该从中得到一般的想法。