使计算属性依赖于emberjs中另一个对象的所有属性

Making a computed property dependent on all the properties of another object in emberjs

本文关键字:属性 一个对象 计算 依赖于 emberjs      更新时间:2023-10-29

是否可以使一个属性依赖于另一个对象的所有属性?例如:(也在jsfiddle中):

html:

<script type="text/x-handlebars" >
    {{outlet}}
</script>
<script type="text/x-handlebars" data-template-name="index">
    <p>Weapon damage: {{ input value=model.activeWeapon.damage}} </p>
    <p>Hero damage: {{ model.weaponDamagePerSecond }}</p>
</script>

javascript:

App = Ember.Application.create({});
App.Weapon = Ember.Object.extend({
    damage: null,
    speed: null
});
App.Hero = Ember.Object.extend({
    activeWeapon: null,
    strength: null,
    weaponDamagePerSecond: function() {
      var weapon = this.get('activeWeapon');
      console.log('weapon damage:' + weapon.get('damage'));
      console.log('weapon speed:' + weapon.get('speed'));
      console.log('strength:' + this.get('strength'));
      console.log (weapon.get('damage') + this.get('strength')) * weapon.get('speed');
      return (1.0 * weapon.get('damage') + 1.0 * this.get('strength')) * weapon.get('speed');
    }.property('activeWeapon', 'strength')
    //}.property('activeWeapon.damage', 'activeWeapon.speed', 'strength')
    // the above line will make the example work, but it is a bit painful to 
    // have to specify all the attributes needed of activeWeapon.
});
App.IndexRoute = Ember.Route.extend({
    model: function() {
        return App.Hero.create({
            activeWeapon: App.Weapon.create({
                damage: 40,
                speed: 2
            }),
            strength: 8
        });
    }
});

activeWeapon上的任何属性更新时,是否可以让weaponDamagePerSecond更新,而不必手动指定所有属性(如注释掉的代码)?

没有,但编写一个观察者非常容易,它可以监视所有内容,并在计算属性更新时触发其更新。我不一定建议这样做,但这是可以做到的。

http://jsfiddle.net/5gS59/

App.Weapon = Ember.Object.extend({
    damage: null,
    speed: null,
    version: 0,
    watchingEverything: function(){
        console.log('hello');
        this.incrementProperty('version');
    }.observes('damage','speed')
});

weaponDamagePerSecond: function() {
  var weapon = this.get('activeWeapon');
  console.log('weapon damage:' + weapon.get('damage'));
  console.log('weapon speed:' + weapon.get('speed'));
  console.log('strength:' + this.get('strength'));
  console.log (weapon.get('damage') + this.get('strength')) * weapon.get('speed');
  return (1.0 * weapon.get('damage') + 1.0 * this.get('strength')) * weapon.get('speed');
}.property('activeWeapon.version', 'strength')

你可以用一个属性而不是一个观察对象来做类似的事情:

http://jsfiddle.net/XsuxA/1/