如何在带点的属性上使用Ember的getter / setter?

时间:2014-06-19 15:44:51

标签: javascript ember.js

在我的webapp中,我有一个模型,其属性的名称是根据服务器的数据动态生成的。例如,我通常会通过我的控制器执行类似的操作来引用它:

var str1 = 'property.name.with.dots'; // String from server
this.get('model.someProperty')[str1].integer = 2;
this.get('model.someProperty')[str1].integer += 1;

但是Ember并不喜欢这样 - 它说我应该使用setget功能。这是有道理的。所以我想做一些这样的事情来取代上面的最后一行:

this.get('model.someProperty.' + str1).incrementProperty('integer');

如果str1没有点,这可以很好地开箱即用。但是,确实如此,我能做些什么来让Ember的吸气者工作?我试过了

this.get('model.someProperty')[str1].incrementProperty('integer');

但它不起作用 - 默认情况下,子对象无法获得Ember的方法。

1 个答案:

答案 0 :(得分:1)

绝对

在将数据交给Ember之前按下数据,在你的名字中加上点会导致过多的链接问题。

清理数据,我选择了_(这不是深度清洁,为了你的乐趣而运动)

App.cleanData = function(result){
  var response = {},
      re = new RegExp('\\.', 'g'),
      newKey;
  for(var key in result){
    newKey = key.replace(re, '_');

    response[newKey] = result[key];
  }
  return response;
};

使用已清理的数据而不是服务器数据

App.FooRoute = Em.Route.extend({
  model: function(){
    return $.getJSON('/foo').then(function(result){
       return App.cleanData(result);
    }
  }
});