2013-02-22 41 views
0

从我的服务器我收到一个对象,它看起来是这样的:使用挖空映射,我该如何映射整个数组属性?

var fromServer = { 
    foo: "Some foo", 
    barArray: [ "bar1", "bar2", "bar3", "bar4", "bar5" ] 
}; 

采用淘汰赛的映射插件,我想自定义视图模型是如何构建和向上突破的数组长度的子阵列2.事情是这样的:

viewModel: { 
    foo: "Some foo", 
    barArray: [ ["bar1", "bar2"], ["bar3", "bar4"], ["bar5"] ] 
} 

在有我的方式,我意识到了create回调被调用每个阵列项目一次。这是我的观点:

<h1 data-bind="text: foo"></h1> 
<ul data-bind="foreach: barArray"> 
    <li data-bind="text: $data.name"></li> 
</ul> 

和JavaScript:

var fromServer = { foo: "Some foo", barArray: [ "bar1", "bar2", "bar3", "bar4", "bar5" ] }; 

var mapping = { 
    'barArray': { 
     create: function(options) { 
      return new barModel("This is " + options.data); 
     } 
    } 
}; 

var barModel = function(data) { 
    this.name = data; 
}; 

var viewModel = ko.mapping.fromJS(fromServer, mapping); 

ko.applyBindings(viewModel); 

Here's a fiddle showing the behaviour

这里是真正问题:使用create回调,我可以访问整个阵列,而不是每个元素,一次?或者,我是否以错误的方式处理了这个问题?

+0

你为什么希望他们分成两列? – 2013-02-22 14:56:31

+0

@PaulManzotti这显然不是真正的问题。我实际上得到了一个月中所有日子的数组,每天都附加一些数据,我需要将该数组分成7天的子数组,以便我可以使用模板呈现日历,一次一个星期。 – 2013-02-22 15:07:11

回答

1

您需要从JSON根做到这一点,映射对象

 var mapping = { 
      '': { 
       create: function(options) { 
        return new ..... 
       } 
      } 
     }; 
0

综观documentation,选项参数传递到创建方法具有两个属性:

data:包含数据该子级的JavaScript对象

parent:父对象或者阵列此孩子所属

所以你可以使用options.parent访问它。

+0

是的,我意识到这一点,但即便如此,回调将被执行一次数组中的每个元素,这是不可取的。我想访问整个数组,一次。 – 2013-02-22 15:23:58

0

你可以调整你的来电数组,你会在创建视图模型前使用它的方式。 而不是使用以某种方式'sematically分组'的数据的数组,您可以将其变成 对象的数组,具有相应的属性填充。

我假设你的数据与平日有关,所以我创建了WeekViewModel,它将保存每周的数据。之前将数据映射到视图模型,如果我用ProcessBeforeCreatingViewModel功能处理:

function WeekViewModel(data) { 
    var self = this; 
    ko.mapping.fromJS(data, {}, self); 
} 

function ProcessBeforeCreatingViewModel(data) { 

var tempObj = null; 

var data_processed = { 
    foo: data ? data.foo : '', 
    barArray: [] 
}; 

if (data && data.barArray) { 

    data.barArray.forEach(function (barItem, index) { 

     if (index % days.length == 0) { 
      tempObj = {}; 
      days.forEach(function (dayName) { 
       tempObj[dayName] = undefined; 
      }); 
      data_processed.barArray.push(tempObj); 
     } 

     tempObj[days[index]] = barItem; 
    }); 
} 

return data_processed; 
} 


var mapping = { 
    'barArray': { 
     'create': function(options) { 
      return new WeekViewModel(options.data); 
     } 
    } 
}; 

var fromServer_Processed = ProcessBeforeCreatingViewModel(fromServer); 

var viewModel = ko.mapping.fromJS(fromServer_Processed, mapping); 

ko.applyBindings(viewModel); 

这里是一个小提琴:http://jsfiddle.net/JeJKP/

+0

鲁斯塔姆,谢谢你的回答,这绝对有帮助!但是,我认为@PabloRodríguez的回答解决了我的问题的症结所在。 – 2013-02-25 09:21:33