如何创建将 1 添加到属性的 Ember 计算属性?

Posted

技术标签:

【中文标题】如何创建将 1 添加到属性的 Ember 计算属性?【英文标题】:How to create an Ember computed property that adds 1 to a property? 【发布时间】:2016-06-27 10:39:44 【问题描述】:

我刚刚学习 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 属性转换为字符串?

无论如何,在我运行时在 ember 检查器中

$E.get('count')

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

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

【问题讨论】:

您考虑过使用Ember.Object.incrementProperty()、link to Ember API吗? 【参考方案1】:

我根据您的代码设置了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' 永远不会改变。这就是为什么你只观察到一个加法。

【讨论】:

以上是关于如何创建将 1 添加到属性的 Ember 计算属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何将过滤后的计算属性与 ember-drag-drop 可排序对象一起使用?

Ember 计算属性在绑定到深度嵌套的属性时不会触发

Ember 数据模型中的计算属性不适用于 ember-cli-mirage 模型

Ember 2,仅在一个计算属性中处理两个或多个属性。如何按搜索文本和类别进行过滤

如何在 Immutablejs 和 Redux 以及 Flux 和 React 中设置类似 Ember 的计算属性

Ember.js、set() 和计算属性