如何创建一个Ember计算属性,为属性添加1?

时间:2016-03-12 02:00:29

标签: javascript ember.js computed-properties

我只是在学习Ember,我对计算属性有点困惑。指南中的所有内容都使用字符串,比如使用名字和姓氏创建全名的计算属性等。无论如何,我对如何使用整数感到困惑,因为似乎语法几乎要求使用字符串。

例如,我的控制器上有一个名为count的属性。

import Ember from 'ember';

export default Ember.Controller.extend({
  count: 0,

  counter: Ember.computed('count', function() {
    var num = `${this.get('count')}`;
    var newNum = parseInt(num) + 1;
    this.set('count', newNum);
    return this.get('count');
  })
});

我知道这段代码非常糟糕,我只是想说明我正在尝试做什么并且失败了。为什么Ember.computed将字符串作为其第一个参数?

当我使用整数而不是字符串时,为什么我必须在this.getthis.set中使用字符串?我必须手动解析int或者它返回一个字符串,为什么它将我的count属性转换为字符串?

无论如何,在我运行的灰烬检查员中

$E.get('count')

它确实成功添加1,但无法继续添加1,这使我认为它不会更新实际的count属性。

非常感谢。我很感激帮助。

1 个答案:

答案 0 :(得分:7)

我根据您的代码设置了Ember Twiddle。我会尝试解决您的每个问题:

您可以将Ember.Object视为{}的包装。所有Ember.Object个键都是字符串,因为{} keys are strings in Javascript

对于存储在Ember.Object上的每个属性,该属性是一个以String为键的值。要查找该值,您必须提供"路径"或"位置"由键给出的值(就像哈希表一样)。这就是您需要在getset中指定字符串的原因。

值可以是Javascript中的任何类型,而不仅仅是字符串。看一下我发布的Ember Twiddle,然后打开你的控制台。在您的代码中,num是一个字符串,因为您已将其包装在ES6模板字符串中,该字符串正在转换this.get('count')的值。

Ember.computed旨在将数据呈现到模板中。理解这一点非常重要:

  • lazy
  • 它缓存计算结果。
  • 如果计算属性中的一个或多个属性发生变化,则 重新计算。

当您致电Ember.computed时,您首先会传入任意数量的字符串。每个字符串都是CP"依赖的值{Ember.Object)的路径。上。

由于CP是惰性的,因此只有在代码或模板中访问时才会计算'counter'。如果要更改'count',则会忘记'counter'的缓存值。访问了 next 时间'counter',它会重新计算。

在这种情况下,'counter' CP功能只运行一次,因为'count'永远不会改变。这就是你只观察一次加法的原因。