【问题标题】:Computed property depending on ALL properties of @each计算属性取决于@each 的所有属性
【发布时间】:2013-03-19 12:47:50
【问题描述】:

我之前使用过的计算属性的类型是这样的:

isAnyoneHungry: function () {
  var everyone = this.get('everyone'),
      anyoneHungry = false;
  everyone.forEach(function(person) {
    if (person.get('isHungry')) {
      anyoneHungry = true;
    }
  });
  return anyoneHungry;
}.property('everyone.@each.isHungry'),

everyone: Ember.A() // an array that will hold person models

用于基于数组中每个对象的一个​​属性进行计算。

是否可以根据数组中每个对象的 每个 属性创建计算属性? 假设person 模型具有许多布尔属性,例如isHungryisTiredisCranky,...并且我希望能够在其中任何一个更改时重新计算此属性。但我很懒,不想像这样输入每个属性:

function(){...}.property('everyone.@each.isHungry', 'everyone.@each.isTired', 'everyone.@each.isCranky'.

相反,我想要这样的东西:

isAnyoneUnhappy: function () {
  var everyone = this.get('everyone'),
      isAnyoneUnhappy = false;
  everyone.forEach(function (person) {
    if (person.get('isHungry') || person.get('isTired') || person.get('isCranky')) {
      isAnyoneUnhappy = true;
    }
  });
  return isAnyoneUnhappy;
}.property('everyone.@each.iWantEveryPropertyHere')

这在 Ember 中是否可行?

【问题讨论】:

  • 我无法让这个简单的小提琴工作,为了方便起见,在这里添加它,因为它与这个问题直接相关。尽管使用了@each.attributeName 表示法,但我无法触发计算属性:jsfiddle.net/a2cxg/1
  • 有时我很难让 jsfiddle 与框架很好地配合,但问题是,与观察者不同,计算属性不会在其列出的子属性发生变化时自动被调用。您必须调用 someObject.get('changeWatcher') 或将其转换为 observer 而不是 property

标签: ember.js


【解决方案1】:

您是否尝试过以下方法?

isAnyoneUnhappy: function () {
  var everyone = this.get('everyone'),
      isAnyoneUnhappy = false;
  everyone.forEach(function (person) {
    if (person.get('isHungry') || person.get('isTired') || person.get('isCranky')) {
      isAnyoneUnhappy = true;
    }
  });
  return isAnyoneUnhappy;
}.property('everyone.@each.*')

我查看了 Ember 源代码,似乎有一些处理星号符号的逻辑。不过我不确定。

【讨论】:

  • 刚才试过了,好像不行。这正是我所希望的。
【解决方案2】:

理想情况下,您应该在 person 上有一个属性来汇总不愉快的属性,例如:

isUnhappy: function () {
  if (this.get('isHungry') || this.get('isTired') || this.get('isCranky')) {
    return true;
  }
}.property('isTired', 'isHungry', 'isCranky')

然后isAnyoneUnhappy 只是观察everyone.@each.isUnhappy

【讨论】:

  • 我同意这是一个理想的解决方案。我试图想出一种方法来解决必须提供所依赖属性的所有名称的问题。您可能想在此处列出很多属性,或者如果您正在动态生成属性,您可能不知道它们是什么。
  • 更好:return this.get('isHungry') || this.get('isTired') || this.get('isCranky') (false -> 无返回值)
猜你喜欢
  • 2020-05-10
  • 2017-04-10
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
相关资源
最近更新 更多