我试图让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数据并且很难找到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数据中保存一对多的关系.我有这样的关系:
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的两个新关系,这不是我想要的.
我想这是一个多对多的关系,我不确定是否支持,但有关如何实现我所描述的任何想法?谢谢
我正在尝试使用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响应有关.这两个问题:
以下是有效回复:
{
"registerUser": {
"id": 11,
"email": "mike999@test.com",
"password": "12345",
"password2": "12345",
"name": "Mike"
}
}
Run Code Online (Sandbox Code Playgroud) 如何在不删除子项的情况下从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) 我想在创建帖子后进行转换.
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框架的理解,有5个组件:
举个例子,假设我有一个在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.
我已经看到了这个问题谈过,但我仍然有粗暴对待蒙戈的问题_id到id.我使用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) 我有一个非常常见的情况:有一个脏模型,如果用户试图转换到任何其他路线,我想显示确认.
我有这样的东西与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不支持承诺.
所以问题是如何通过异步确认来防止转换到另一条路线?
我知道这个主题已经围绕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()?
对我来说最好的解决方案是什么?
谢谢你的帮助!