Ember.js 只有一个实例的余烬模型
我想在余烬建立一个购物袋模型。购物袋将在加载页面时创建,并使用LocalStorage适配器保存在LocalStorage中。在任何给定的时间,应该只保存一个包的实例,因为用户只需要将产品添加到一个购物袋中。我的问题是:当余烬数据迎合具有多个实例的模型时,我似乎对我在包中获取和设置数据的方法很在行。有没有更好的方法来构造/定义我的包模型,它更适合于单实例模型?这是我的模型:Ember.js 只有一个实例的余烬模型,ember.js,ember-data,Ember.js,Ember Data,我想在余烬建立一个购物袋模型。购物袋将在加载页面时创建,并使用LocalStorage适配器保存在LocalStorage中。在任何给定的时间,应该只保存一个包的实例,因为用户只需要将产品添加到一个购物袋中。我的问题是:当余烬数据迎合具有多个实例的模型时,我似乎对我在包中获取和设置数据的方法很在行。有没有更好的方法来构造/定义我的包模型,它更适合于单实例模型?这是我的模型: import DS from 'ember-data'; export default DS.Model.extend(
import DS from 'ember-data';
export default DS.Model.extend({
products: DS.hasMany('product', {async: true}),
productCount: function() {
return this.get('products.length');
}.property('products.length')
});
当我想在模板中获取productCount时,唯一能让它打印出来的方法就是使用一个嵌套了{{{each}}
语句的{{productCount}
。由于只有一个包,这似乎效率低下。在代码的其他部分中,我需要获取包的当前实例并对其执行操作。为了让它发挥作用,我找到了所有的包,然后得到了firstObject
,它看起来也像是黑客:
import Ember from "ember";
export default Ember.ArrayController.extend({
actions: {
addToBag: function(model) {
this.store.find('bag').then(function(bags) {
var bag = bags.get('firstObject');
bag.get('products').then(function(products) {
products.pushObject(model);
bag.save();
});
});
}
}
});
我的申请路线使用行李作为模型,并设置控制器:
import Ember from "ember";
var ApplicationRoute = Ember.Route.extend({
activate: function() {
var store = this.store;
store.find('bag').then(function(bags) {
var existing_bag = bags.get('firstObject');
// If there isn't already a bag instantiated, make one and save it
if(typeof existing_bag === 'undefined') {
var new_bag = store.createRecord('bag');
new_bag.save();
}
});
},
model: function() {
return this.store.find('bag');
},
setupController: function(controller,model) {
controller.set('content', model);
}
});
有什么办法可以提高效率吗?我不想让它变成乱七八糟的代码。非常感谢 如果你想拥有多个购物袋,你可以尝试使用以下“单件”方法: 基本上,它添加了“current”属性,可以在整个代码中用作单个实例
但是,如果您不需要有多个实例,这可能不是最佳选择。如果上面是您的BagController,那么它应该是ObjectController 必须获取第一个对象的原因是
find
获取存储中该模型类型的所有项。您可能只有一个,但是find
不知道,除非您提供一个id,并且如果这个包还没有存储在您的数据库中,它可能还没有
我不会从商店
获取行李模型,而是将您的行李和产品控制器与需求
链接,然后简单地访问该控制器的模型属性。您甚至可以设置别名以快速访问它
例如:
import Ember from "ember";
export default Ember.ArrayController.extend({
needs: 'bag',
bag: Ember.computed.alias("controllers.bag.model").
actions: {
addToBag: function(model) {
this.get('bag').get('products').pushObject(model);
}
}
});
当您的应用程序首次启动时,ApplicationRoute
仅启动一次,因此您无需检查是否已经存在行李型号。唯一会出现的就是你创建的那个。您应该在模型中执行此操作。您不需要将内容设置为模型。默认情况下,它会这样连接
import Ember from "ember";
export default Ember.Route.extend({
model:function() {
return this.store.createRecord('bag');
}
});
谢谢你的快速回答。这当然是有帮助的。.current()
方法是否也在控制器中工作?i、 e.this.store.find('bag').current()
我在弄清楚如何访问控制器中的current()方法时遇到了困难,因此非常感谢您的帮助:)控制器是单例的,并且始终只有一个实例。singleton方法适用于任何具有多个实例的对象。Nicholas--这是我的indexController,不是我的BagController。对不起,我应该说得更具体些。它需要是一个数组控制器,因为索引路由在一个产品列表中循环。如果您仍然必须获取第一个对象,那么您在某个地方做了一些错误的事情。可能你是如何在控制器中设置模型的。我更新了我的问题,加入了应用程序路径,将模型设置为“包”。这有助于解决问题吗?尼克,谢谢你的回答!我知道你想在这里做什么,但是按照设置的方式,每次路线被击中时,它都会创造一个新的记录。至少从我的角度来看,这将导致创建重复的包。难道不应该进行某种检查,看看是否已经有一个包了吗?不,当应用程序第一次启动时,ApplicationRoute只被点击一次。