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

Posted

技术标签:

【中文标题】Ember.js、set() 和计算属性【英文标题】:Ember.js, set(), and computed properties 【发布时间】:2017-12-18 14:46:08 【问题描述】:

我正在阅读set() 方法的Ember.js API reference,但我不理解某个特定段落。

计算属性

如果您尝试在具有计算属性的键上设置值 处理程序定义(参见 get() 方法的示例),然后 set() 将 调用该方法,同时传递值和键,而不是简单地传递 改变价值本身。这对那些你有用的时候 需要实现一个由一个或多个成员组成的属性 属性。

我了解set() 是如何独立工作的,但是即使在阅读了本段之后,设置计算属性(函数)仍然无法点击。

谁能提供更多解释或示例?

【问题讨论】:

【参考方案1】:

您可以阅读https://guides.emberjs.com/v2.14.0/object-model/computed-properties/#toc_setting-computed-properties 以获得更好的理解。

在这里,我只是想解释同样的事情。

import Ember from 'ember';
export default Ember.Component.extend(
    firstName: '',
    lastName: '',
    fullNameCP: Ember.computed('firstName', 'lastName', function() 
        return `$this.get('firstName') $this.get('lastName')`
    ),
    fullNameCPwithGetSet: Ember.computed('firstName', 'lastName', 
        get(key) 
            return `$this.get('firstName') $this.get('lastName')`;
        ,
        set(key, value) 
            let [firstName, lastName] = value.split(/\s+/);
            this.set('firstName', firstName);
            this.set('lastName', lastName);
            return value;
        
    )
);

在上面, 如果我们说,this.set('fullNameCP','Yehuda Katz') 之后它将被视为普通属性,它不会被视为计算属性。您不应手动将 fullNameCP 设置为新值。如果您想这样做,那么您需要使用 Getter 和 Setter 定义 Computed 属性,例如 fullNameCPwithGetSet

如果我们说this.set('fullNameCPwithGetSet','Yehuda Katz'),那么它也会通过传递值来调用计算属性fullNameCPwithGetSetset 方法,即Yehuda Katz,这样我们就可以为依赖键设置准确的值。

【讨论】:

当您说“之后它将被视为普通财产”时,您究竟是什么意思?有什么例子可以检查行为吗?什么时候会发生这种情况? 另外,使用 Ember.set(a, b,c) 有同样的效果吗? 这意味着,当您为没有getter的计算属性设置值时,这意味着如果有任何依赖属性更改,它将不会重新计算。 Also, does using Ember.set(a, b,c) have the same effect - 是的,Ember.setthis.set 相同。

以上是关于Ember.js、set() 和计算属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ember.js 中创建计算属性以查看单个 Ember Data 属性是不是脏?

Ember.js 在回调中返回计算属性

Ember.js:在服务的把手中使用计算属性

coffeescript 1.7 破坏了我的 ember.js 计算属性

组件中的 Ember.js 计算属性 vs 观察者 vs didReceiveAttrs()

使用两个输入字段创建具有计算机属性(getter 和 setter)的 Date 对象 Ember JS