【问题标题】:Computed properties in controller in EmberEmber 控制器中的计算属性
【发布时间】:2017-05-21 19:03:42
【问题描述】:

我是 Ember 的初学者。该应用程序是一个睡眠跟踪器。我现在要构建的是过去 N 天内平均睡眠和小睡的小时数。

为了计算平均值,我想我想在控制器上添加一个计算属性。我还没有模型,因为这个应用太原始了。

这是我当前的代码:

// app/routes/home.js
import Ember from 'ember';

let events = [
  {
    "dow": 5,
    "durationInSeconds": 29280,
    "endAt": 1471087260000,
    "startAt": 1471057980000,
    "timezone": "America/Montreal"
  },
  { ... }
]

export default Ember.Route.extend({
  model() {
    return events.sortBy("startAt").reverse();
  }
});

// app/controllers/home.js
import Ember from 'ember';

export default Ember.Controller.extend({
  averageNapDuration() {
    console.log("model: %o", this.get('model'));
    return 0;
  },

  averageNightDuration() {
    // TODO
  }
});

// app/templates/home.hbs
<table>
  ..
  <tfoot>
    <tr>
      <td scope="row" colspan="3">Average nap</td>
      <td class="duration">{{format-duration averageNapDuration}}</td>
    </tr>
    <tr>
      <td scope="row" colspan="3">Average night</td>
      <td class="duration">{{format-duration 22680}}</td>
    </tr>
  </tfoot>
</table>

我的format-duration 辅助函数对接收到的值执行console.log。当需要显示平均值时,format-duration 会收到一个函数而不是一个值。

我也没有在控制器中看到console.log 调用。

在 Handlebars 模板中,我尝试使用:

{{format-duration averageNapDuration() }}

但这会返回语法错误:

Error: Parse error on line 48:
...">{{format-duration averageNapDuration()
-----------------------^
Expecting 'CLOSE_RAW_BLOCK', 'CLOSE', 'CLOSE_UNESCAPED', 'OPEN_SEXPR', 'CLOSE_SEXPR', 'ID', 'OPEN_BLOCK_PARAMS', 'STRING', 'NUMBER', 'BOOLEAN', 'UNDEFINED', 'NULL', 'DATA', 'SEP', got 'INVALID'

作为另一个测试,我将控制器更改为使用计算属性:

averageNapDuration: Ember.computed.sum('@each.durationInSeconds')

这一次,format-duration 说它收到 0,这向我表明,模板至少与控制器正确对话。

在哪里可以找到过滤数组的计算属性示例?我必须在上面的代码中更改什么来计算整数的总和?

【问题讨论】:

  • 如果你想使用计算属性,为什么不阅读一下如何编写它们,使用Ember.computedfunction() {}.computed 语法? The docs are clear enough.
  • 格式持续时间助手在哪里?我认为对此的理解是问题的一部分。您应该创建一个简化的 ember-twiddle 来深入了解这一点。
  • @sheriffderek,format-duration 助手对手头的讨论并不重要。它已经正确格式化了一个普通值。这个 Twiddle 暴露了问题:ember-twiddle.com/2596daefabd8a1e2d3439465b6f0df45。 nap 函数返回一个普通值,该值在生成的 HTML 中显示不正确。另一方面,night 函数返回一个计算值,该值正确显示。查看控制台:夜间日志,而小睡没有。我希望能够声明一个函数并在从模板调用时让它执行。

标签: ember.js computed-properties


【解决方案1】:

这会引发解析错误。

{{format-duration averageNapDuration() }}

您不能在辅助参数中调用函数。以下将正常工作。

{{format-duration averageNapDuration }}

你的控制器会是这样的,

import Ember from 'ember';

export default Ember.Controller.extend({
    averageNapDuration: Ember.computed('model', function() {
        console.log("model: %o", this.get('model'));
        //You can calculate avg nap duration and return the result
        return 0;
    }),
    //this computed property will be called for every durationInSeconds property changes
    averageNightDuration: Ember.computed('model.@each.durationInSeconds', function() {
        //You can calculate avg night slepp duration and return the result
    })
});

如果我们将依赖键用作model.[],那么每次添加/删除事件并更改为全新的不同数组时都会调用计算属性。

如果我们将依赖键用作model.@each.durationInSeconds,那么每次durationInSeconds 属性更改时都会调用计算属性,并且对于每个事件时间事件都将被添加/删除到model。并且整个 model 属性更改为全新的不同数组。

computed propertiesComputed Properties and Aggregate Data 的 Ember 指南链接会更好地解释。

【讨论】:

  • 使averageNapDuration 依赖于model 不太可能是正确的。只有当模型对象本身发生变化时才会重新计算,而不是其内容。
  • @torazaburo,你是对的。我需要对 model.@each.durationInSeconds 的值的更改以及行的添加和删除做出反应。谢谢!
猜你喜欢
  • 2014-05-26
  • 2014-08-19
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
相关资源
最近更新 更多