Binding 如何在设置模型时将别名设置为model.attr的属性,否则设置为default.attr?

Binding 如何在设置模型时将别名设置为model.attr的属性,否则设置为default.attr?,binding,ember.js,Binding,Ember.js,如果model不为空,则如何创建作为model.someProperty别名的双向属性,否则如何创建作为default.someProperty别名的双向属性?目前,我将a的两个版本包装在{if model}}中,一个绑定到model,另一个绑定到defaults,但是我想从模板中删除逻辑。此外,在某些情况下,集合在交换select之前触发,这会导致错误,因为模型为null 设置模型时,新模型应将someProperty设置为default.someProperty。目前,我通过以下方式实现:

如果model不为空,则如何创建作为model.someProperty别名的双向属性,否则如何创建作为default.someProperty别名的双向属性?目前,我将a的两个版本包装在{if model}}中,一个绑定到model,另一个绑定到defaults,但是我想从模板中删除逻辑。此外,在某些情况下,集合在交换select之前触发,这会导致错误,因为模型为null

设置模型时,新模型应将someProperty设置为default.someProperty。目前,我通过以下方式实现:

modelChanged: function(){
  if(default && default.get('someProperty')){
    this.set('model.someProperty', default.get('someProperty'));
  }
}.observes('model')
我也想知道这是否是最好的方法。

DS.attr可以采取的措施。这有用吗

var Post = DS.Model.extend({
  title: DS.attr('string', { defaultValue: "Work in progress" })

我不知道这是否可行,只需要几行。但是,可以创建计算属性宏:

var get = Ember.get, set = Ember.set;

Ember.computed.aliasWithDefaultTo = function(dependentKey, defaultPath) {
  return Ember.computed(dependentKey, defaultPath, function(key, value) {
    if (arguments.length > 1) {
      set(this, dependentKey, value || get(this, defaultPath));
      return value;
    } else {
      return get(this, dependentKey) || get(this, defaultPath);
    }
  });
};

现场演示

我不知道这是否可行,只使用了几行。我在那把小提琴上做了一个计算宏。你认为呢?默认值需要是动态的。但是@marcio rodrigues correa junior的小提琴展示了一种比我第一次尝试更好的演奏方法,这是一个计算属性中的一切。我必须检查他的方式是否与我的方式相同:计算属性被激发两次。如果有帮助的话,defaultValue也可以接受函数。通过坚持使用DS.attr,您已经获得了一个处理getter和setter的Ember.computed属性。不管怎样,祝你好运。