2013-10-31 95 views
0

我很困惑。 我有以下模式,轉變爲ATTR標籤和夾具:來自陣列的渲染項目

Tracker.Story = DS.Model.extend({ 
    title: DS.attr('string'), 
    tags: DS.attr('array', []), 
}); 

DS.ArrayTransform = DS.Transform.extend({ 
deserialize: function(serialized) { 
    return serialized; 
}, 
serialize: function(deserialized) { 
    return deserialized.split(','); 
} 
}); 

Tracker.register("transform:array", DS.ArrayTransform); 

Tracker.Story.FIXTURES = [ 
{ 
    id: 1, 
    title: "Some story", 
    tags: ["tag1", "tag2", "tag3"], 
} 

和模板

{{#each itemController="story"}} 
    {{title}} 
    {{#each tag in tags}} 
     {{tag}} 
    {{/each}} 
{{/each}} 

它的作品很好的從興業故事。

{{input type="text" value=tags}} 

來變換正確地工作,並從串([1,2,3]從「1,2,3」,例如)返回數組: 我經由接口,其中輸入字段定義增加新的故事。

,但沒有渲染的標籤添加故事接下來的消息:

斷言失敗:值#each遍歷必須是一個數組。您通過1個ember.js:417

遺漏的類型錯誤:對象1沒有方法 'addArrayObserver' ember.js:22976

未捕獲的錯誤:你的東西都給爲了重新渲染後它在被插入到DOM之前呈現。

回答

2

輸入幫助程序不支持將項目保存爲數組。它在輸入字段中正確顯示的原因是因爲toString在對象上被調用,並且數組的toString是1,2,3等等......當您更改輸入字段時,它將爆炸基礎數組並將其保存爲一個字符串1,2,3。

轉換隻在加載/保存模型時執行,而不是在每個對基礎模型的get/set中執行。

最好的辦法是將輸入字段與一個不同的屬性相關聯,並且該字段會更改您使用數組更新基礎字段。

像這樣的東西會工作:

http://emberjs.jsbin.com/EMapanu/3/edit

App.IndexRoute = Ember.Route.extend({ 
    model: function() { 
    return ['red', 'yellow', 'blue']; 
    }, 
    setupController: function(controller, model){ 
    this._super(controller, model); 
    controller.set('fakeModel', model); 
    } 
}); 

App.IndexController = Em.ArrayController.extend({ 

    modelUpdater: function(){ 
    var fm = this.get('fakeModel'); 
    if(!(fm instanceof Array)){ 
     fm = (this.get('fakeModel') || "").split(','); 
    } 
    this.set('model', fm); 
    }.observes('fakeModel') 
});