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

时间:2014-05-26 13:35:31

标签: ember.js ember-data handlebars.js

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

基本上我有一堆问题'楷模。基本上简化版本是:

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

答案是一个数组。由于默认情况下没有DS.attr('数组'),我已将其定义为:

/* 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.is_active}}把手助手。 奇怪的是,如果我触发操作,请导航'返回',然后导航'转发',{{#if this.is_active}}帮助器正确呈现。

这让我完全难过了好几天。任何指针都会受到大力赞赏。

1 个答案:

答案 0 :(得分:1)

如果您只是使用Ember get / set设置属性,那么您可能会绊倒,如果您只是使用foo.property设置它.Ember已经无法捕捉到财产发生变化的事实。由于我猜测答案本身并不是一个Ember对象,你仍然可以使用Ember.set(obj, 'property', value),任何观察者都会收到通知,告知该属性已经改变。

var answers = this.get('answers'),
    answer = answers.objectAt(0);

Ember.set(answer, 'is_active', true);