如何确定给定ED模型的“商店名称”(不确定适当的术语是什么)?假设我有App.Payment
,是否有商店方法让我查找其对应的名称,即payment
(例如在find
查询中使用)?
答案 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.find
,store.createRecord
和其他持久性方法使用store.modelFor('myModel')
。在一些设置之后,它会调用container.lookupFactory('model:' + key);
,其中key是'myModel'。因此任何有效的工厂查找语法都适用。例如:
鉴于名为OrderItems
的模型,您可以使用:order.items
,order_items
,order-items
,orderItems
。
答案 3 :(得分:-1)
事实证明毕竟没有必要这样做,这就是原因:
我正在尝试使用模型的字符串表示形式(payment
的“App.Payment
”)来调用store.findAll("payment")
。但是,查看ED source for store
,findQuery
函数会调用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;
},