我很困惑。 我有以下模型,转换为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}}
它适用于FIXTURES的故事。 我通过界面添加了新故事,输入字段定义为:
{{input type="text" value=tags}}
转换正确工作并从字符串返回数组(例如,[1,2,3]来自“1,2,3”)。
但无法使用下一条消息为添加的故事呈现标记:
断言失败:#each循环的值必须是一个数组。你通过了1个ember.js:417
未捕获的TypeError:对象1没有方法'addArrayObserver'ember.js:22976
未捕获错误:您执行的某些操作导致视图在渲染后但在插入DOM之前重新渲染。
答案 0 :(得分:2)
输入助手不支持将项目保存为数组。它正确显示在输入字段中的原因是因为在对象上调用了toString,并且数组的toString是1,2,3等等...当你更改输入字段时,它会爆破底层数组并将其保存为字符串1,2,3。
转换仅在加载/保存模型时执行,而不是在每个获取/设置到基础模型时执行。
您最好将输入字段与不同的属性相关联,并且随着该字段的更改,您将使用数组更新基础字段。
这样的事情会起作用:
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')
});