在自定义DS上设置烬数据属性.Attr类型——或者刷新模板视图



这一直是我无尽痛苦的原因,希望有人能给我指出正确的方向。我参与的第一个Ember.JS项目。

基本上我有一堆"问题"模型。简而言之就是:

App.Question = DS.Model.extend({
  title: DS.attr('string'),
  answers: DS.attr('array'),
  chosen_answers: DS.attr('array'),
});

Answers是一个数组。由于默认情况下没有DS.attr('array'),因此我通过以下方式定义它:

/* Register 'array' data type */
DS.ArrayTransform = DS.Transform.extend({
  deserialize: function(serialized) {
    return (Ember.typeOf(serialized) == "array")
        ? serialized 
        : [];
  },
  serialize: function(deserialized) {
  var type = Ember.typeOf(deserialized);
    if (type == 'array') {
        return deserialized
    } else if (type == 'string') {
        return deserialized.split(',').map(function(item) {
            return jQuery.trim(item);
        });
    } else {
        return [];
    }
  }
});
App.register("transform:array", DS.ArrayTransform);

无论如何,答案数组被填充为(重要位…)(title, is_active)的关联数组。当选择了答案时,Is_active被设置为true。

问题模型保存了一个答案数组。在我的模板中,当我单击呈现的答案之一时,我向QuestionController发送一个操作。在这个动作中,我希望能够做到:

this.set('answers[0].is_active', true);

(显然用正确的索引替换'0',但这对这个问题并不重要)。

我认为我最接近的是:

var answers = this.get('answers');
answers[0].is_active = true;
this.set('answers', answers);

但是这不会更新{{#if this。模板中的handlebars帮助器。奇怪的是,如果我启动动作,导航"后退",然后导航"前进",{{#如果这个。Is_active}} helper呈现正确

这让我困惑了好几天。

你可能会绊倒,因为你设置一个属性不使用Ember的get/set,如果你只是设置它使用foo。属性烬没有办法捕捉属性已经改变的事实。因为我猜答案本身不是一个烬对象,你仍然可以使用Ember.set(obj, 'property', value)和任何观察者观察将被通知属性已经改变。

var answers = this.get('answers'),
    answer = answers.objectAt(0);
Ember.set(answer, 'is_active', true);

相关内容

最新更新