2013-10-31 63 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') 
});