2014-01-30 70 views
0

我要地图JSON数组数据以下列方式来observablearray:敲除映射对象阵列可观测到的阵列和创建计算属性对象的foreach

var modell = function() { 


    self.activities = ko.observableArray(); 
    ... 


    ko.mapping.fromJS(dataJson, {}, self.activities); 
    // as a result I can use self.activities[0].FirstName or other properties 
} 

每个活动是复杂的对象。 为简单起见,我们可以假设每个活动内有两个属性 - FirstNameLastName。这很好,但是有可能写 映射选项,它会为每个活动创建可计算的可观察的FullName

所以,我需要引用像self.activities [0] .FirstName,以及self.activities [0] .FullName,其中FirstName是简单的可观察,但FullName计算。

编辑: 这是一个尝试的jsfiddle以下建议http://jsfiddle.net/5ScWn/ & & http://jsfiddle.net/8PK6F/,但它仍然无法正常工作。

回答

2

是的,可以使用映射选项为可观察数组中的每个项目创建计算的observable(s)。请尝试以下操作:

 var mappingOptions = { 
      'activities': { 
       create: function (options) { 
        return (new (function() { 
         this.fullName = ko.computed(function() { 
          return this.firstName() + ' ' + this.lastName; 
         }, this); 

         ko.mapping.fromJS(options.data, {}, this); // continue the std mapping 
        })()); 
       } 
      } 
     }; 

,然后通过ko.mapping.fromJS(dataJson, mappingOptions, self.activities);

+0

我缺少的东西使用它,而是“活动”永远都达到了?这可能是因为dataJson没有'活动'映射元素,但是是obects数组? – renathy

+0

这里是我的小提琴你的例子:http://jsfiddle.net/5ScWn/或这个http://jsfiddle.net/8PK6F/,在这个例子中我有更复杂的用户对象,它可以使问题? – renathy

+0

@renathy我更新了你发布的第一个小提琴[here](http://jsfiddle.net/5ScWn/1/)。尽管我将计算出的'userFullName'从User'对象上移了一级。如果你想把它保存在'User'中,你必须添加addtl映射选项来为'Activities'可观察数组中的每个项目创建一个'User'可观察值。 – rwisch45