我正试图在Ember建立一个购物袋模型。购物袋将在加载页面时创建,并使用LocalStorage适配器保存在LocalStorage中。在任何给定时间,应该只保存一个包的一个实例,因为用户只需要将产品添加到一个购物袋。我的问题是:看起来我正在使用我的方法来获取和设置数据包,因为Ember数据适用于具有多个实例的模型。有没有更好的方法来构建/定义更适合单实例模型的包模型?这是我的模特:
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();
});
});
}
}
});
我的应用程序路径使用bag作为其模型,并设置控制器:
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);
}
});
这里有什么想法可以提高效率吗?我不希望这会变成混乱的代码。非常感谢提前!
答案 0 :(得分:1)
如果您可能希望能够拥有多个购物袋,那么您可以尝试使用“单身人士”'方法话语如下:https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/mixins/singleton.js
基本上它增加了当前的'您可以在整个代码中用作单个实例的属性。
但是,如果您不需要拥有多个实例,这可能不是最佳选择。
答案 1 :(得分:1)
如果那是你上面的BagController,那么它应该是一个ObjectController。
您必须获取第一个对象的原因是find
在store
中提取该模型类型的所有项目。您可能只有一个,但find
并不知道,除非您提供了ID,并且如果此包尚未存储在您的数据库中,它可能还没有。
不是从store
获取包模型,而是将包和产品控制器与needs
链接起来,然后只需访问该控制器的模型属性。您甚至可以设置别名以便能够快速访问它。
例如:
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
只会被解雇一次,当您首次启动应用时,您无需检查是否已有行李包模型。唯一存在的就是你创造的那个。您应该在model
挂钩中执行此操作。您不需要将内容设置为模型。它默认会像这样连接起来。
import Ember from "ember";
export default Ember.Route.extend({
model:function() {
return this.store.createRecord('bag');
}
});