是否可以使一个属性依赖于另一个对象的所有属性?例如:(也在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/