Ember模型只有一个实例

时间:2014-10-12 21:30:51

标签: ember.js ember-data

我正试图在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);
  }
});

这里有什么想法可以提高效率吗?我不希望这会变成混乱的代码。非常感谢提前!

2 个答案:

答案 0 :(得分:1)

如果您可能希望能够拥有多个购物袋,那么您可以尝试使用“单身人士”'方法话语如下:https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/mixins/singleton.js

基本上它增加了当前的'您可以在整个代码中用作单个实例的属性。

但是,如果您不需要拥有多个实例,这可能不是最佳选择。

答案 1 :(得分:1)

如果那是你上面的BagController,那么它应该是一个ObjectController。

您必须获取第一个对象的原因是findstore中提取该模型类型的所有项目。您可能只有一个,但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');
    }
});