【问题标题】:Adding custom properties to Ember Model向 Ember 模型添加自定义属性
【发布时间】:2015-12-01 14:40:26
【问题描述】:

我正在尝试将自定义属性添加到 Ember 数据模型。具体来说,我想添加一个属性来定义要在我正在编写的 Ember 数据适配器中使用的 REST 端点。

我的模型是这样定义的(带有自定义属性“endPoint”):

import DS from 'ember-data';

export default DS.Model.extend({

partner_id      : DS.attr('string'),
partner_key     : DS.attr('string'),
partner_name    : DS.attr('string'),
created         : DS.attr('string'),
status          : DS.attr('string'),
type            : DS.attr('string'),

endPoint        : 'api_entry'

});

在我的适配器中,我尝试按如下方式访问该属性:

_buildURL: function (modelName, store, id, snapshot, requestType, query) {

    var host, namespace, url;

    var model = store.modelFor(modelName);

    var endPoint = model.endPoint;
    var endPoint2 = Ember.get(model, 'endPoint');

    console.log(endPoint, endPoint2);

    host = Ember.get(this, "host");
    namespace = Ember.get(this, "namespace");

    url = [];

    if (host) {
        url.push(host);
    }

    if (namespace) {
        url.push(namespace);
    }

    url.push(modelName);

    url = url.join("/");

    if (!host) {
    url = "/" + url;
    }

    return url;
},

在上面的console.log 中,endPoint 和endPoint2 都是未定义的。我是 Ember 和 Javascript 的新手。我究竟做错了什么?有没有更“灰烬”的方式来做到这一点?我不想使用实际的 REST 端点名称作为我的模型名称,因为它们不符合 Ember 模型命名约定。

非常感谢您的帮助。

【问题讨论】:

    标签: javascript ember.js ember-data


    【解决方案1】:

    您的buildURL 函数处理模型class,而不是模型instance。您需要将属性添加到类中:

    var model = DS.Model.extend({
      partner_id      : DS.attr('string'),
      partner_key     : DS.attr('string'),
      partner_name    : DS.attr('string'),
      created         : DS.attr('string'),
      status          : DS.attr('string'),
      type            : DS.attr('string')
    });
    
    model.reopenClass({
      endPoint        : 'api_entry'
    });
    
    export default model;
    

    【讨论】:

    • 这可行,但我不确定模型是否适合放置它。最好使用适配器。
    • 那么您需要为每个型号配备一个特殊的适配器。这样您就可以在应用程序适配器中编写一次代码
    • @dwickern - 非常感谢您的回答,让我省去了很多挫败感!我想我在这里遗漏了一个基本概念,让我解释一下。我可以将自定义属性添加到通过以下方式派生的控制器:'export default Ember.Controller.extend' 那么为什么我不能将它们添加到也通过“extend”派生的模型中:'export default DS.Model.extend ' 控制器 API 文档说“扩展”创建了一个新的子类,这对模型来说不一样吗?
    • 您对 classtype 与该类型的 instance 之间的区别感到困惑——a面向对象编程的基本概念。当您扩展一个类型时,您会为该类型的实例创建一个蓝图:您创建的每个模型实例都会有一个partner_id。但是store.modelFor 不返回模型实例,而是返回可用于create 实例的模型类。指南中的更多信息:guides.emberjs.com/v1.13.0/object-model/classes-and-instances
    • 谢谢。我从 C++ 的早期生活中对 OO 有一个合理的理解。我不明白你之前关于store.modelFor 返回类而不是实例的解释。现在一切都说得通了,感谢您抽出宝贵时间。
    猜你喜欢
    • 2020-11-23
    • 2011-02-18
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 2015-09-23
    • 2015-03-09
    • 2018-08-06
    • 1970-01-01
    相关资源
    最近更新 更多