javascript - 如何创建一个将属性加 1 的 Ember 计算属性?

标签 javascript ember.js computed-properties

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

例如,我的 Controller 上有一个名为 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 属性转换为一个字符串?

无论如何,在我运行时在 ember inspector 中

$E.get('计数')

它确实成功加 1,但未能继续加 1,这让我认为它没有更新实际的 count 属性。

非常感谢。感谢您的帮助。

最佳答案

我设置了一个 Ember Twiddle根据你的代码。我会尽力解决您的每个问题:

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

对于存储在 Ember.Object 上的每个属性,该属性都是一个以某个字符串作为键的值。要查找该值,您必须提供该值的“路径”或“位置”,如键所给(就像哈希表一样)。这就是为什么您需要在 getset 中指定一个字符串。

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


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

  • 懒惰
  • 它缓存计算结果。
  • 计算属性将在其依赖的一个或多个属性发生变化时重新计算。

当您调用 Ember.computed 时,您首先传入任意数量的字符串。每个字符串都是您的 CP“依赖”的值(在 Ember.Object 上)的路径。

因为 CP 是惰性的,'counter' 只会在您在代码或模板中访问它时计算。如果 'count' 发生变化,'counter' 的缓存值将被遗忘。 下一次 'counter' 被访问时,它将重新计算。

在这种情况下,'counter' CP 函数只运行一次,因为'count' 永远不会改变。这就是为什么您只观察到一次加法。

关于javascript - 如何创建一个将属性加 1 的 Ember 计算属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35952858/

相关文章:

javascript - 无法通过 ember 安装 bourbon

ember.js - Ember 无法读取未定义的属性 'extend'

javascript - 数组上的 Ember 计算属性

typescript - 使用 Getter 和 Setter 计算的 Vue 属性不会在 Webpack 中编译

javascript - 我的媒体查询不起作用的原因是什么

php - 最小化 jQuery 函数

javascript - 如何避免 Vue js 2 组件中的对象引用问题?

javascript - 将一个对象放入数组,然后将另一个对象插入数组

javascript - 通过 store.find 获取当前用户 ('users' , 'me' ) 存储无效的 User 实例

javascript - vue.js 将数据属性设置为方法的返回值