【问题标题】:Ember data: computed attributesEmber 数据:计算属性
【发布时间】:2018-12-18 14:08:56
【问题描述】:

我想知道是否有办法将计算属性与 ember 数据一起使用,例如,我想根据其他属性的数量计算和保存 totalPrice。我认为我能想到的唯一方法是使用观察者来做这件事

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    Ember data model 和普通的Ember Object 之间没有什么不同,您可以在模型上定义计算属性,就像为组件、控制器、路由等所做的一样。请检查official ember guide。它有以下模型示例:

    import DS from 'ember-data';
    import { computed } from '@ember/object';
    
    export default DS.Model.extend({
      firstName: DS.attr(),
      lastName: DS.attr(),
    
      fullName: computed('firstName', 'lastName', function() {
        return `${this.firstName} ${this.lastName}`;
      })
    });
    

    其中fullName 被定义为取决于firstNamelastName 的计算属性。让我们根据需要创建一个包含totalPrice 的人工模型:

    import DS from 'ember-data';
    import { computed } from '@ember/object';
    
    export default DS.Model.extend({
      originalPrice: DS.attr('number'),
      vat: DS.attr('number'),
      discount: DS.attr('number')
    
      totalPrice: computed('originalPrice', 'vat', 'discount', function() {
        return this.originalPrice + this.vat - this.discount;
      })
    });
    

    类似于上面的东西应该可以正常工作。

    在关于将计算属性发送到后端的评论之后;某事类似于serializer 的以下自定义应该可以工作:

    import DS from 'ember-data';
    
    export default DS.JSONAPISerializer.extend({
      serialize(snapshot, options) {
        let json = this._super(...arguments);
    
        json.totalPrice = snapshot.record.get('totalPrice')
    
        return json;
      },
    });
    

    【讨论】:

    • 是的,我理解那部分,但是我希望该计算属性与模型一起保存,与 DS.attr 相同
    • 计算属性不会持久保存在您的 API 中。你在找default values吗?
    • 您可以通过自定义序列化程序在发送到服务器的 JSON 中包含 totalPrice:guides.emberjs.com/release/models/customizing-serializers/…
    • @Gaurav 我在答案中添加了一个自定义序列化程序;那是……在看到有关将CP 发送到后端的评论后,我打算这样做。我没有尝试提供的代码;但我猜你的想法与我提供的相似。对吗?
    猜你喜欢
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 2014-04-01
    相关资源
    最近更新 更多