如何获取Ember Data模型的商店名称

时间:2013-11-21 09:31:26

标签: ember.js ember-data

如何确定给定ED模型的“商店名称”(不确定适当的术语是什么)?假设我有App.Payment,是否有商店方法让我查找其对应的名称,即payment(例如在find查询中使用)?

4 个答案:

答案 0 :(得分:26)

对于Ember Data 1.0(及更高版本)

modelName是一个虚线字符串。它存储为类属性,因此如果您有模型的实例:

var model = SuperUser.create();
console.log(model.constructor.modelName); // 'super-user'

对于Ember Data Pre 1.0

typeKey是模型的字符串名称。它被存储为模型的类属性,因此如果您有模型的实例:

var model = App.Name.create({});
console.log(model.constructor.typeKey); // 'name'

答案 1 :(得分:0)

您可能正在寻找Ember的字符串dasherize方法:

var fullClassName = "App.SomeKindOfPayment";
var className = fullClassName.replace(/.*\./, ""); // => "SomeKindOfPayment"
var dasherizedName = Ember.String.dasherize(className); // "some-kind-of-payment"

在Ember中可能有一种内置方式可以做到这一点,但是在花了一些时间看之后我还没有找到它。

编辑:Ember Data也可以让你在需要模型名称时传递“App.SomeKindOfPayment” - 它通常会检查模型名称的格式并自行将其更新为所需的格式。

答案 2 :(得分:0)

store.findstore.createRecord和其他持久性方法使用store.modelFor('myModel')。在一些设置之后,它会调用container.lookupFactory('model:' + key);,其中key是'myModel'。因此任何有效的工厂查找语法都适用。例如:

鉴于名为OrderItems的模型,您可以使用:order.itemsorder_itemsorder-itemsorderItems

答案 3 :(得分:-1)

事实证明毕竟没有必要这样做,这就是原因:

我正在尝试使用模型的字符串表示形式(payment的“App.Payment”)来调用store.findAll("payment")。但是,查看ED source for storefindQuery函数会调用modelFor从字符串(App.Payment)中查找工厂(payment),除非是工厂已经提供。通过调用this.get('model').type,可以从控制器轻松访问工厂。没有必要将其转换为字符串(并返回)。

以下是Ember数据源的相关代码。

modelFor: function(key) {
    var factory;

    if (typeof key === 'string') {
      factory = this.container.lookupFactory('model:' + key);
      Ember.assert("No model was found for '" + key + "'", factory);
      factory.typeKey = key;
    } else {
      // A factory already supplied.
      factory = key;
    }

    factory.store = this;
    return factory;
  },