标签: ember-data

Ember Data中的类继承有很多关联

我试图让Ember Data使用与类继承的hasMany关联.

Ember代码中的示例:

var Person = DS.Model.extend({
  name: DS.attr('string'),
  animals: DS.hasMany('Animal')
});

var Animal = DS.Model.extend({
  name: DS.attr('string'),
  owner: DS.belongsTo('Person')
});

var Dog = Animal.extend({
  isBarking: DS.attr('boolean')
});

var Cat = Animal.extend({
  isMeowing: DS.attr('boolean')
});

var fred = Person.createRecord({name: 'Fred'});
var ed = Dog.createRecord({name: 'Ed', isBarking: true});
// This gives:
// Error: assertion failed: You can only add records of Animal to this relationship.
fred.get('animals').pushObject(ed);
Run Code Online (Sandbox Code Playgroud)

我希望能够animals为每个人添加Cat和Dog实例.

Mongoid为Ruby/Rails提供的内容给出了如何实现它的一个例子:

http://mongoid.org/en/mongoid/docs/documents.html#inheritance

我知道Mongoid的继承实现(_type每个记录的自定义属性)可能对Ember Data来说太具体了.

如果有人能给我一个提示是否可以使用Ember Data进行上述提示,如果可以,我将如何实现这一点,我们将不胜感激.如果这是Ember Data根本不支持的东西,那也是我想要的答案.

我正在运行Ember 1.0.0-pre4和几天前的自定义Ember Data构建.

ember.js ember-data

9
推荐指数
1
解决办法
932
查看次数

如何使用Ember数据访问json中的嵌套对象

我正在使用Ember数据并且很难找到get ember来识别来自服务器的JSON响应中的嵌套属性.这是ember-1.0.0-pre.4.js.

目前,我已经设置了与Ember数据修订版11相关的模型

# School Model
App.School = DS.Model.extend
  addr:       DS.belongsTo('App.Addr')

  name:       DS.attr 'string'
  status:     DS.attr 'string'

# Address Model
App.Addr = DS.Model.extend
  school:   DS.belongsTo 'App.School'

  line1:    DS.attr 'string'
  city:     DS.attr 'string'
  state:    DS.attr 'string'
  iso:      DS.attr 'string'
Run Code Online (Sandbox Code Playgroud)

这是我服务器的JSON响应:

{"schools":
 [{
    "_id":"51020261bbc3b8c526000007",
    "name":"Willamette",
    "status":"p",
    "addr":{
      "line1":"122 Evergreen Terrace",
      "city":"Springfield",
      "state":"IL",
      "iso":"US"
    }
   }    
  ]}
Run Code Online (Sandbox Code Playgroud)

我的适配器设置如下:

    App.Store = DS.Store.extend
      revision: 11
      adapter: DS.RESTAdapter.create({
        url: "http://localhost:8000/api"
        serializer: DS.RESTSerializer.extend
        primaryKey: (type) ->
          '_id';
      }) 
Run Code Online (Sandbox Code Playgroud)

更新:我试图映射addr属性,如下所示.仍然没有骰子......

DS.RESTAdapter.map 'App.School', 
  addr: { embedded: 'always'}
Run Code Online (Sandbox Code Playgroud)

在我的模板中,我想做这样的事......

   <script …
Run Code Online (Sandbox Code Playgroud)

ember.js ember-data

9
推荐指数
2
解决办法
8490
查看次数

Ember数据保存了一段感情

我很难在ember数据中保存一对多的关系.我有这样的关系:

App.ParameterSet = DS.Model
    name: DS.attr("string")
    regions: DS.hasMany("App.Region")

App.Region = DS.Model
    name: DS.attr("string")
Run Code Online (Sandbox Code Playgroud)

如果我做这样的事情:

parameterSet = App.ParameterSet.find(5)
@transaction = @get("store").transaction()
@transaction.add(parameterSet)
region1 = App.Region.find(10)
region2 = App.Region.find(11)
parameterSet.set("name", "foo")
parameterSet.get("regions").pushObject(region)
@transaction.commit()
Run Code Online (Sandbox Code Playgroud)

然后我想看到带有这样的有效负载的PUT请求:

api/ParameterSets/5

{parameterSet: {name: "foo", regionIds:[10, 11]}}
Run Code Online (Sandbox Code Playgroud)

但相反,我得到了这个:

{parameterSet: {name: "foo"}}
Run Code Online (Sandbox Code Playgroud)

我不关心从孩子到父母的关系,但如果我添加parameterSet: DS.belongsTo("App.ParameterSet")到App.Region模型,那么我得到2个PUT请求到区域url的两个新关系,这不是我想要的.

我想这是一个多对多的关系,我不确定是否支持,但有关如何实现我所描述的任何想法?谢谢

javascript ember.js ember-data

9
推荐指数
1
解决办法
3131
查看次数

从未使用Ember-Data save()触发成功回调

我正在尝试使用ember-data来获取一个简单的注册表单以保存在我的服务器上.这个电话在技术上有效,但成功回调永远不会触发承诺,我不知道为什么.

服务器从前端接收数据并成功将其保存到数据库.然后它返回CREATED的状态代码201.我可以看到Chrome调试器中发生的成功响应.但即使服务器响应成功状态,也会在save的承诺上触发错误回调.我已经通过调试器确认每次都会发生这种情况; 错误回调中的语句.

我的路由器的模型连接起来像这样:

model: function() {
  return this.store.createRecord('registerUser');
}
Run Code Online (Sandbox Code Playgroud)

我的控制器中有一个简单的寄存器功能:

register: function() {
  var self = this;
  this.get('model').save().then(function() {
     self.transitionToRoute('index');
  }, function(resp) {
     if (resp.responseJSON) {
       self.get('model').set('errors', resp.responseJSON.errors);
     } 
  });
}
Run Code Online (Sandbox Code Playgroud)

每次我的服务器返回响应,成功或失败时,都会遇到故障回调.如果我在响应中有错误(对于无效数据或其他内容),则错误会在表单中成功显示.我可以看到请求正确进入,数据存储在数据库中.因此,保存在技术上是成功的,但是即使从服务器返回成功的201状态(可以在Chrome调试器中验证),ember似乎也不知道它.

我唯一能想到的是ember-data的适配器正在做一些我不知道的事情,但我只是使用默认的RESTAdapter而没有触及它.还有别的事吗

如果它有所不同,服务器正在运行Play 1.2.5.我不知道这是否会对响应的标题或类似内容产生影响.

任何帮助将不胜感激.感谢您的时间!

麦克风

因此,问题与JSON响应有关.这两个问题:

  • 我没有在回复中包含ID
  • 我没有在"registerUser"中"包装"响应.这是匹配模型名称所必需的.

以下是有效回复:

{
  "registerUser": {
    "id": 11,
    "email": "mike999@test.com",
    "password": "12345",
    "password2": "12345",
    "name": "Mike"
  }
}
Run Code Online (Sandbox Code Playgroud)

ember.js ember-data

9
推荐指数
1
解决办法
3584
查看次数

从hasMany关系中删除子项

如何在不删除子项的情况下从hasMany关系中删除子项?

我已经尝试将子项的foreign_key设置为null.我也尝试在父关系上使用removeObject.

这是一个例子.

App.Invoice = DS.Model.extend
  lines: DS.hasMany('App.Line')

App.Line = DS.Model.extend
  invoice: DS.belongsTo('App.Invoice')

App.InvoiceController = Ember.Controller.extend
  removeLine: (line) ->
    @get('content.lines').removeObject(line)
    line.set('invoice', null)
    @get('store').commit()

App.InvoiceEditView = Ember.View.extend
  templateName: 'invoice'

App.LineView = Ember.View.extend
  tagName: 'tr'
  templateName: 'line'


#invoice template
<table>
    {{#each content.tasks}}
      {{view App.LineView}}
    {{/each}}
</table>

#line template
<td><a {{action "removeLine" view.context}}>remove</a></td>
<td>{{description}}</td>
<td>{{price}}</td>
<td>{{price}}</td>
Run Code Online (Sandbox Code Playgroud)

我目前正在使用

jquery 1.8.2
ember.js v1.0.pre-4
ember-data v11
Run Code Online (Sandbox Code Playgroud)

ember.js ember-data

8
推荐指数
1
解决办法
2821
查看次数

保存余烬数据模型后的转换

我想在创建帖子后进行转换.

post/new> click submit> rails backend成功创建帖子并响应json>重定向到新创建的帖子的路径

在ember_data_example github源代码中.他们使用这种方法

 transitionAfterSave: function() {
     // when creating new records, it's necessary to wait for the record to be assigned
     // an id before we can transition to its route (which depends on its id)
     if (this.get('content.id')) {
       this.transitionToRoute('contact', this.get('content'));
     }
 }.observes('content.id'),
Run Code Online (Sandbox Code Playgroud)

它工作正常,因为模型在创建模型时ID为null,并且当模型保存成功时其ID将更改,因为此函数会观察模型ID的更改.

但也许,只要模型的ID属性发生变化,就会执行此功能.我发现了更多的语义方式.

我希望在模型的状态更改为'isDirty'= false &&'isNew'== true form''isDirty'= true,'isNew'= false时执行转换.

我该如何实现呢?

ember.js ember-data

8
推荐指数
1
解决办法
8306
查看次数

了解Ember视图

我正在寻找关于Ember.js观点的一些澄清

来自铁路背景,我试图忽略任何先入之见.根据我对ember框架的理解,有5个组件:

  • 路由:这是我们定义应用程序状态的地方.状态反映在URL中.我们也可以在这里定义数据加载.路由类已定义,并且在启动时,ember会创建持续应用程序持续时间的路由对象.
  • 模型:这是定义对象数据的地方.也可以定义计算属性.为从服务器返回的每个json对象创建一个模型对象.
  • 控制器:它调解模型和模板/视图之间的交互.定义控制器类,并在启动时,ember创建持续应用程序持续时间的控制器对象.每个控制器类只有一个实例.
  • 模板:这些描述了生成的标记.
  • 视图:这些是与模型相关的特定模板或dom元素.这些用于定义接口事件并将它们发送到控制器进行处理.不知道何时创建这些.

举个例子,假设我有一个在applicationRoute上加载数据的EventsController:

ScheduleApp.EventsController = Ember.ArrayController.extend();

ScheduleApp.ApplicationRoute = Ember.Route.extend({
  setupController: function() {
    this.controllerFor('events').set('content', ScheduleApp.Event.find());
  }
});
Run Code Online (Sandbox Code Playgroud)

现在在我的模板中,而不是遍历每个模板并显示我想要迭代的每个信息,并创建一个关联的视图,以便我可以为每个事件添加交互.我认为我需要为每个事件创建一个新视图并将其显示在我的模板中.但是,我不确定在哪里创建这些视图.我是否定义了一个视图类,然后每次使用视图助手调用它时,ember都会创建一个新的视图对象?最后我想在视图上使用appendTo将我的事件注入到dom中的不同位置.这将被定义在哪里?

我已经尝试阅读ember.js视图指南,但它描述了创建单个视图的上下文.我想我想为每个事件创建许多视图,然后动态地与这些对象进行交互.

到目前为止,ember一直非常聪明,所以我认为有一种内置的方法来生成这些视图.毕竟,大多数用户界面都充满了需要交互的列表.问题是我试图制作的列表然后根据其属性扩展到dom.

model-view-controller ember.js ember-data

8
推荐指数
1
解决办法
1455
查看次数

Ember,Ember Data和MongoDB的_id

我已经看到了这个问题谈过,但我仍然有粗暴对待蒙戈的问题_idid.我使用mongoose作为我的ORM,虽然它有虚拟,我似乎无法让它正常工作.以下是我的猫鼬模型中的内容.

尝试从后端修复

mongoose = require 'mongoose'
Schema = mongoose.Schema
ObjectId = Schema.ObjectId

ApartmentSchema = new Schema
  body: String
  date: { type: Date, default: Date.now }
  deleted: {type: Boolean, default: false}
  saved: {type: Boolean, default: false}
  visited: {type: Boolean, default: false}
  email: String
  phoneNumber: String
  href: String

ApartmentSchema.virtual('id').get -> return @_id

module.exports = mongoose.model 'Apartment', ApartmentSchema
Run Code Online (Sandbox Code Playgroud)

当我在Express中创建这个模型的新实例时,我可以查看apt.id并获取id,但是当我将响应发送到客户端时,我只是拥有_id而不是id.

我尝试的第二个解决方案是创建一个计算属性,id但无论出于什么原因,ember都不喜欢这个.这里有两个问题.Ember不尊重被称为id或至少不再被计算的属性.这就是我的余烬数据模型.

尝试从前端修复它

App.Apartment = DS.Model.extend({
  body: DS.attr('string'),
  date: DS.attr('date'),
  deleted: …
Run Code Online (Sandbox Code Playgroud)

mongoose mongodb ember.js ember-data

8
推荐指数
3
解决办法
4260
查看次数

Ember.js:如何使用异步确认阻止脏模型的转换?

我有一个非常常见的情况:有一个脏模型,如果用户试图转换到任何其他路线,我想显示确认.

我有这样的东西与window.confirm确认对话框一起工作:

var EventRoute = Ember.Route.extend({
  actions: {
    willTransition: function(transition) {
      var event = this.modelFor(this.routeName);
      if (event.get('isDirty') && !confirm("Are you sure?")) {
        transition.abort();
      } else {
        event.rollback();
        return true;
      }
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

但是,如果我想使用异步确认(例如bootbox.js确认),我该如何停止转换?

我试图回来,Ember.RSVP.Promise但似乎willTransition不支持承诺.

所以问题是如何通过异步确认来防止转换到另一条路线?

javascript ember.js ember-data

8
推荐指数
1
解决办法
1764
查看次数

批量保存多个模型

我知道这个主题已经围绕stackoverflow和其他论坛进行了讨论,但我找不到正确的方法来做到这一点.

我有一个名为"post"的模型,其中包含帖子信息(用户,描述等).用户收到一些帖子,读取它们并对它们进行操作.当我申请GET时,帖子来自我的api/api/posts/

我还有一个名为"后置状态"的模型,我保存阅读帖子的人的动作:当他们喜欢,分享,投票或喜欢帖子时.

export default DS.Model.extend({
    post: belongsTo('post'),
    user: belongsTo('user'),
    liked: attr('boolean', { defaultValue: false }),
    favourited: attr('boolean', { defaultValue: false }),
    voted: attr('boolean', { defaultValue: false }),
    shared: attr('boolean', { defaultValue: false }),
});
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法让我的ember应用程序大量保存我的后状态模型,就像我批量收到帖子的方式一样.邮政状态将通过api调用POST保存/api/post-states/

我在讨论中读到最好的方法是创建一个自定义适配器,但我不知道该怎么做才能做到这一点...也许创建一个函数saveAllRecords()

对我来说最好的解决方案是什么?

谢谢你的帮助!

javascript ember.js ember-data

8
推荐指数
1
解决办法
677
查看次数