从数组中渲染项目

时间:2013-10-31 16:04:44

标签: ember.js

我很困惑。 我有以下模型,转换为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之前重新渲染。

1 个答案:

答案 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')
});