标签: ember-data

使用ember-data在Ember.js RC1中侧载属于数据

Sideloading正在我们的应用程序中用于hasMany关系,但我无法让它为belongsTo关系工作.我正在尝试使用记录的DS.RESTAdapter.configure()方法,但这似乎没有任何影响.我得到的错误是Uncaught Error: assertion failed: Your server returned a hash with the key occasions but you have no mapping for it.

请注意,我们不需要指定hasManysideload映射,因为该请求才有效.App.Occasion.find();工作良好.App.Reminder.find();抛出错误.

楷模

App.Reminder = DS.Model.extend(
  occasion: DS.belongsTo('App.Occasion')
  ...
)
App.Occasion = DS.Model.extend(Ember.Validations,
  reminders: DS.hasMany('App.Reminder')
  ...
)
Run Code Online (Sandbox Code Playgroud)

Store.js.coffee

DS.RESTAdapter.configure('App.Occasion',
    sideLoadAs: 'occasions'
)
App.Store = DS.Store.extend(
  revision: 11
  adapter: DS.RESTAdapter.create()
)
Run Code Online (Sandbox Code Playgroud)

JSON(用于场合)

{
  reminders: [{},...],
  occasions: [{reminders: [1,2,...]},...]
}
Run Code Online (Sandbox Code Playgroud)

JSON(用于提醒)

{
  reminders: [{occasion_id: 1},...],
  occasions: [{},...]
}
Run Code Online (Sandbox Code Playgroud)

ember.js ember-data

2
推荐指数
1
解决办法
991
查看次数

嵌套路由的命名约定是什么?

(这个问题与这个jsbin有关)

我有以下路由器配置:

App.Router.map(function() {

    this.resource('profile', function () {
        this.route('user');
        this.route('userEdit');
        this.route('company');
        this.route('companyEdit');
        this.resource('products', function () {
            this.route('index');
            this.route('show',   { path: '/:product_id/show' });
        });
    });

});
Run Code Online (Sandbox Code Playgroud)

有了这个,ember数据需要以下控制器:

  • ProfileIndexController
  • ProfileUserController
  • ProfileUserEditController
  • ProfileCompanyController
  • ProfileCompanyEditController

以下路线:

  • ProfileRoute
  • ProfileIndexRoute
  • ProfileUserRoute
  • ProfileUserEditRoute
  • ProfileCompanyRoute
  • ProfileCompanyEditRoute

以下模板:

  • 指数
  • 轮廓
  • 资料/指数
  • 资料/用户
  • 资料/ USEREDIT
  • 资料/公司
  • 资料/ companyEdit

但我无法解决嵌套的资源配置文件/产品.我期待控制器在:

  • ProfileProductsController
  • ProfileProductsIndexController
  • ProfileProductsShowController

路线在:

  • ProfileProductsIndexRoute
  • ProfileProductsShowRoute

以及模板:

  • 简介/产品
  • 简介/产品/指数

相反,通过跟随链接#/profile/products/index,ember正在生成以下对象:

generated -> route:products Object {fullName: "route:products"}
generated -> route:products.index Object {fullName: "route:products.index"}
generated -> controller:products Object {fullName: …
Run Code Online (Sandbox Code Playgroud)

ember.js ember-data

2
推荐指数
1
解决办法
1058
查看次数

尝试为DS.Store创建自定义适配器时断言失败

刚刚上传到ember1.0和最新的余烬数据.现在当我尝试创建我的商店时,我收到了这个错误.

断言失败:您尝试将adapter属性设置为实例DS.Adapter,应该是名称或工厂

App.Store = DS.Store.extend({
    revision: 12,
    adapter: adapter.create()
});
Run Code Online (Sandbox Code Playgroud)

有什么新的/正确的方法吗?

ember.js ember-data

2
推荐指数
1
解决办法
1514
查看次数

保存嵌套模型

我有两个这样的模型:

App.Build = DS.Model.extend({
    allegiance: DS.attr('string'),
    profession: DS.attr('string'),
        skills: DS.hasMany('skill')
});

App.Skill = DS.Model.extend({
    name:DS.attr('string'),
    value:DS.attr('number')
});
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,我有控制来设置每项技能的忠诚度,职业和价值(最多55个).

然后在我的应用程序控制器的动作哈希中,我有一个动作将构建模型保存到服务器.

save:function(){
     var store = this.get('store');
     var skills = this.get('controllers.skills').get('model');
     console.log(skills);
     var build = store.createRecord('build',{
          profession:1,
          allegiance:1,
          skills:skills
      });

      build.set('skills',skills);
      build.save();

      console.log('Saved!');
}
Run Code Online (Sandbox Code Playgroud)

但是当构建模型发送到服务器时,技能属性是一个空数组:

{"build":{"allegiance":"1","profession":"1","skills":[]}}
Run Code Online (Sandbox Code Playgroud)

我确定我做错了什么,但我无法弄清楚什么,也找不到任何关于它的好文档.另外一点,我关心提交的是技能ID和价值.

任何帮助将不胜感激!

更新:

按照Daniel的建议,我编辑了save函数,使用pushObjects将技能放入Build模型,然后保存.它现在工作得更好.生成的帖子数据现在是这样的:

{"build":{
    "allegiance":1,
     "profession":1,
          "skills":["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55"]}}
Run Code Online (Sandbox Code Playgroud)

这是技能ID的列表.在帖子中没有提交任何其他属性.我已经尝试迭代技能,创建一个新对象,只是推入id和值,这是我需要的唯一部分,但这给了我一个错误.有点像,不能使用undefined,必须是类型技能.

这似乎是Ember数据应该本地处理的东西.是否有一些我缺少的东西让它在请求中发送其他技能属性?

谢谢!!

ember.js ember-data

2
推荐指数
1
解决办法
2241
查看次数

ember-data belongsTo不工作

我有以下型号:

当我调用this.store.find('history');

调用http :: //www.example.com/api/histories/并返回此JSON响应:

{
   "tracks":[
      {
         "id":83,
         "title":"Untitled",
         "length":148,
         "artist_ids":[

         ],
         "album_ids":[

         ]
      },
      {
         "id":85,
         "title":"You want it",
         "length":262,
         "artist_ids":[

         ],
         "album_ids":[

         ]
      },
      {
         "id":81,
         "title":"Untitled",
         "length":133,
         "artist_ids":[

         ],
         "album_ids":[

         ]
      },
      {
         "id":78,
         "title":"Untitled",
         "length":345,
         "artist_ids":[

         ],
         "album_ids":[

         ]
      },
      {
         "id":80,
         "title":"Untitled",
         "length":225,
         "artist_ids":[

         ],
         "album_ids":[

         ]
      },
      {
         "id":73,
         "title":"Untitled",
         "length":366,
         "artist_ids":[

         ],
         "album_ids":[

         ]
      },
      {
         "id":77,
         "title":"Untitled",
         "length":161,
         "artist_ids":[

         ],
         "album_ids":[

         ]
      },
      {
         "id":82,
         "title":"Untitled",
         "length":384,
         "artist_ids":[

         ],
         "album_ids":[

         ] …
Run Code Online (Sandbox Code Playgroud)

javascript json ember.js ember-data

2
推荐指数
1
解决办法
1350
查看次数

从hasMany关系中删除多个记录会导致js错误

我有简单的模型定义为:

        App.Answer = DS.Model.extend({
            name: DS.attr('string')
        });

        App.Question = DS.Model.extend({
            questionName: DS.attr('string'),
            answers: DS.hasMany('answer')
        });
Run Code Online (Sandbox Code Playgroud)

我希望能够添加问题模型的答案,并且能够通过单击按钮删除所有hasMany关联.但是当我在循环中调用deleteRecord时,它会抛出js错误.替代方法是在删除每条记录之后引入一些延迟,我认为这不是正确的做事方式.

这里是用于演示问题的jsbin链接:http://jsbin.com/UleKodiC/2/ 单击"添加"按钮几次,然后单击"全部删除",它应该给你js错误,模型是未定义的.但是,如果单击"删除缓慢"(延迟删除),它会删除记录而不会出现错误.

谢谢,迪

ember.js ember-data

2
推荐指数
1
解决办法
1701
查看次数

Ember App Kit和测试模型钩子

在Ember App Kit中,有许多测试示例随初始回购一起提供.其中之一是基本的路线单元测试.如果数据在模型钩子中是硬编码的,那么这个测试是微不足道的,如下所示:

test("#model", function(){
  deepEqual(route.model(), ['red', 'yellow', 'blue']);
});
Run Code Online (Sandbox Code Playgroud)

如果它从ember-data返回一个promise,你如何使用隔离容器来测试模型钩子?

这是测试:

import Activities from 'appkit/routes/activities';

var route;
module("Unit - ActivitiesRoute", {
  setup: function(){
    var container = isolatedContainer([
      'route:activities'
    ]);

    route = container.lookup('route:activities');
  }
});

test("#model", function(){
  deepEqual(route.model(), ['activity', 'activity2', 'activity3']);
});
Run Code Online (Sandbox Code Playgroud)

而实际的Route的模型钩子:

export default Ember.Route.extend({
  model: function() {
    return this.get('store').find('activity');
  }
});
Run Code Online (Sandbox Code Playgroud)

更新:

从kingpin2k实施以下不同方法后.以下是结果摘要.

第一种方法:效果很好......但没有承诺.

第二种方法:返回promise对象(似乎已解析),但数组和正确的值被赋给_detail属性.

test("#model", function(){
  deepEqual(route.model()['_detail'], ['activity', 'activity2', 'activity3']); //passes
});
Run Code Online (Sandbox Code Playgroud)

我想在模块设置()中处理商店创建.

...
module("Unit - ActivitiesRoute", {
  setup: function(){
    var container = isolatedContainer([
      'route:activities' …
Run Code Online (Sandbox Code Playgroud)

ember.js ember-data ember-app-kit

2
推荐指数
1
解决办法
1034
查看次数

Ember PromiseArray sortBy

好的,所以我有一个控制器,它的模型设置如下:

App.MyModel = DS.Model.extend({
    myOtherProperty: attr(),
    mySortKey: attr(),
    mySubCollection: function () {
        return this.store.filter('MyOtherModel', function (myOtherModel) {
            //Some basic filtering logic (it's actually more complex than this)
            return myOtherModel.get('someProperty') == this.get('myOtherProperty');
        });
    }.property('myOtherProperty')
})
Run Code Online (Sandbox Code Playgroud)

实际的过滤函数并不重要 - 重要的是'mySubCollection'计算属性返回DS.PromiseArray对象.上述模型的控制器类型为'Ember.ObjectController',因为它只显示单个对象.

显示此属性的模板使用{{each}}帮助程序执行此操作:

MyTemplate的:

{{#each mySubCollection}}
    {{view App.MyView}}
{{/each}}
Run Code Online (Sandbox Code Playgroud)

现在 - 我需要按'mySortKey'属性按降序排序这个promise数组.我怎样才能做到这一点?文档说DS.PromiseArray从Ember.Array扩展,但在'mySubCollection'的计算属性末尾添加'sortBy('mySortKey:desc')'导致它破坏而根本不起作用 - 这是有道理的,因为我会在一个承诺而不是数组上调用'sortBy'.

我看了一堆不同的想法,不断出现的是切换到使用ArrayController.我可以做到这一点,但它并不理想,因为它在一个非常简单的设置之上添加了一堆复杂性,它已经很好用了(除了排序).

有什么想法吗?

javascript handlebars.js ember.js ember-data

2
推荐指数
1
解决办法
1943
查看次数

EmberJS:是否可以仅保存修改过的对象?

我有一个小而相当标准的应用程序:

  • 从服务器获取对象
  • 渲染对象并允许对它们进行一些编辑.如果这很重要,则此编辑仅影响DS.hasMany属性.
  • 提供保存回服务器(它不应该自动发生,仅在用户请求时)

app控制器处理一个save事件,然后我存储了这些东西.代码如下所示:

import Ember from 'ember';

export default Ember.Controller.extend({
    actions: {
        save() {
            this.store.peekAll('object').forEach(obj => {
                obj.save();
            });
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

这会为本地加载的每个对象发出PUT请求.它工作正常,但它有点蛮力.相反,我想只保存修改过的对象.

我已尝试使用dirtyType,但它返回的undefined内部.forEach,还有hasDirtyAttributes,但它false总是返回.

我可以构建自己的修改对象缓存,但这将是很多工作和容易出错.有没有处理这种情况的标准方法?提前致谢.

javascript ember.js ember-data

2
推荐指数
1
解决办法
610
查看次数

Emberjs:无法读取未定义的属性"类型"

我在我的ember应用程序中创建了一个名为ticket-stats的模型:

import Model from 'ember-data/model';
import attr from 'ember-data/attr';

export default Model.extend({

    get_tickets_more: attr(),
    get_tickets: attr(),
    get_avg_tickets: attr()

});
Run Code Online (Sandbox Code Playgroud)

数据来自JSON api:http://domain.com/data/ticketStats?blank = blah ...所以我为这个名为ticket-stats的模型添加了一个特殊的适配器:

import JSONAPIAdapter from 'ember-data/adapters/json-api';

export default JSONAPIAdapter.extend({

    host: 'http://domain.com',
    namespace: 'data',

    pathForType: function(type) {
        return Ember.String.camelize(type);
    }
});
Run Code Online (Sandbox Code Playgroud)

我在路上获得了这个模型的数据:

import Ember from 'ember';

export default Ember.Route.extend({

    model () {
        var ticketData;
        this.store.query('ticket-stats', { teamID: 218, attUID: 'oc7569', useProd: 1})
                .then(function(stats) { ticketData = stats; });

        return Ember.RSVP.hash({
            currentUser: this.currentUser,
            ticketStats: ticketData
        }); …
Run Code Online (Sandbox Code Playgroud)

ember.js ember-data

2
推荐指数
1
解决办法
4616
查看次数