Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 只有一个实例的余烬模型_Ember.js_Ember Data - Fatal编程技术网

Ember.js 只有一个实例的余烬模型

Ember.js 只有一个实例的余烬模型,ember.js,ember-data,Ember.js,Ember Data,我想在余烬建立一个购物袋模型。购物袋将在加载页面时创建,并使用LocalStorage适配器保存在LocalStorage中。在任何给定的时间,应该只保存一个包的实例,因为用户只需要将产品添加到一个购物袋中。我的问题是:当余烬数据迎合具有多个实例的模型时,我似乎对我在包中获取和设置数据的方法很在行。有没有更好的方法来构造/定义我的包模型,它更适合于单实例模型?这是我的模型: import DS from 'ember-data'; export default DS.Model.extend(

我想在余烬建立一个购物袋模型。购物袋将在加载页面时创建,并使用LocalStorage适配器保存在LocalStorage中。在任何给定的时间,应该只保存一个包的实例,因为用户只需要将产品添加到一个购物袋中。我的问题是:当余烬数据迎合具有多个实例的模型时,我似乎对我在包中获取和设置数据的方法很在行。有没有更好的方法来构造/定义我的包模型,它更适合于单实例模型?这是我的模型:

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只被点击一次。