【问题标题】:Making inner object in observableArray an observable使 observableArray 中的内部对象成为可观察对象
【发布时间】:2012-12-06 04:41:44
【问题描述】:

假设我的 viewModel 中有一个名为 moviesobservableArray,其中包含与此类似的数据...

[{
    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,但如果我只想让一个属性可观察怎么办。是否可以只制作UserMoviesobservableArray,我该怎么做?

【问题讨论】:

    标签: knockout.js knockout-mapping-plugin


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-11-15
        • 2019-01-30
        • 1970-01-01
        • 1970-01-01
        • 2021-11-13
        • 1970-01-01
        • 1970-01-01
        • 2017-06-17
        • 2020-12-12
        相关资源
        最近更新 更多