2013-02-22 83 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