我真的陷入了由Ember数据引起的大量问题,并且缺乏嵌入式记录支持.
我搜索了整个网络,大多数帖子已经过时,其他的已经过时+要求我使用第三方库或连接300行特殊代码有很多缺点.
我不知道如何使用嵌入式记录和今天的ember-data?
编辑:现在有一个新的文档http://emberjs.com/api/data/classes/DS.EmbeddedRecordsMixin.html
我的模型类型以-y:Security结尾
我如何告诉Ember Data使用/证券代替/ securitys为此寻找资源?
(更新为ember-data API Rev 11 ...)
使用按需加载关联的正确方法是什么?特别是,一旦你加载子记录,你如何处理从服务器重新加载父记录清空hasMany数组的事实?我不希望(也许不能)包括的子记录的ID在父的数组.还是有其他方法可以做到这一点,我错过了?DS.Adapter.findAssociation(...)DS.Adapter.findHasMany(...)hasMany
作为旁注,我很困惑应该在关键链接的hasMany/ belongsTo定义中传递哪些选项(如果我没有侧载数据或ID数组,我应该使用映射吗?),所以如果你认为我的问题可以在我的协会定义中,你很有可能是对的.
我正在编写自己的子类,DS.RESTAdapter将ember-data绑定到ASP.NET WebAPI后端(使用Entity Framework).到目前为止一切都那么好,但我有一段时间让协会正常工作.
类似这样的海报,我注意到烬数据的头版说 使用地说,如果你有一个hasMany在你的模型关联,你get该财产,商店会发出为孩子记录的请求.从页面引用:
如果您要请求个人资料,请执行以下操作:
Run Code Online (Sandbox Code Playgroud)author.get('profile');... REST适配器会向URL/profiles发送请求吗?author_id = 1.
这意味着如果你没有侧载并且不包含一组id,会发生这种情况.我意识到这些文档有点过时了,但是我无法在API版本7或更新的版本9中实现这一点.但是在版本9中我确实找到了在版本11中有findAssociation方法,findHasMany方法,我猜是可能已经用来实现这一点,我现在正在尝试使用它.
我不想做的三个主要原因(可能不能):
使用ASP.NET WebAPI如何做这些事情并不明显,至少不是我使用的基于装饰的简单方法.而且,我现在非常喜欢后端的简单性和轻薄性,使用EF和WebAPI它几乎完全是每个实体的样板,我已经完成了!我甚至可以"免费"获得OData过滤支持.
我的子记录通常会通过昂贵的查询生成(例如聚合...指标汇总).并且单个父实体有许多不同类的子实体.因此,即使为所有子类型获取ID 也会很昂贵,并且生成和侧载所有子记录都是不可能的.
我有子实体,主键是复合键.我还没有看到这样的例子甚至在ember-data中得到支持/可能,至少不是用于处理关联(例如,你将如何做一组id?).我在我的客户端模型中创建了一个计算属性,它将复合键强制转换为单个字符串,因此我可以使用从存储中检索单个记录find(...),但是我再也不知道它如何与关联一起工作.
findAssociationfindHasMany我已经发现在API版本9(和一些早期版本但不是全部?) 11中,我可以实现该方法来检索关联的子记录.这大部分都有效,但需要一些体操.这是我的通用方法:DS.Adapter.findAssociationDS.Adapter.findHasManyhasManyfindAssociationfindHasMany
findHasMany: function (store, record, relationship, ids) {
var adapter = this; …Run Code Online (Sandbox Code Playgroud) 我无法embedded hasMany使用ember数据正常工作.
我有类似的东西
App.Post = DS.Model.extend({
comments: DS.hasMany('App.Comment')
});
App.Comment = DS.Model.extend({
post: DS.hasMany('App.Post'),
name: attr('string')
});
Run Code Online (Sandbox Code Playgroud)
我的API返回以下内容GET /post:
[
{
id: 1
comments: [{name: 'test'}, {name: 'test2'}]
},
...
]
Run Code Online (Sandbox Code Playgroud)
我需要发送以下内容POST /post:
[
{
comments: [{name: 'test'}, {name: 'test2'}]
},
...
]
Run Code Online (Sandbox Code Playgroud)
我想与Ember模型合作并让他们提出适当的要求:
var post = App.store.createRecord(App.Post, hash_post_without_comments);
post.get('comments').createRecord(hash_comment);
App.store.commit(); // This should call the POST api
Run Code Online (Sandbox Code Playgroud)
和
var posts = App.store.find(App.Post); // This should call the GET api
Run Code Online (Sandbox Code Playgroud)
当我尝试类似的东西时post: DS.hasMany('App.Post', {embedded: …
我在运行下面的代码时得到了这个断言:
不允许在inBuffer状态下清空视图,在正常情况下不应该这样做.很可能您的应用程序中存在错误.这可能是由于过多的财产变更通知.
链接到演示:http: //plnkr.co/edit/s3bUw4JFrJvsL690QUMi
var App = Ember.Application.create({
Store: DS.Store.extend({
revision: 4,
adapter: DS.FixtureAdapter.create()
}),
Router: Ember.Router.extend({
root: Ember.Route.extend({
index: Ember.Route.extend({
route: "/",
connectOutlets: function(router){
var person;
person = App.Person.find(657);
person.addObserver("isLoaded", function() {
return router.get('router.applicationController').connectOutlet("things", person.get("things"));
});
}
})
})
}),
ApplicationController: Em.Controller.extend(),
ApplicationView: Em.View.extend({
template: Em.Handlebars.compile("{{outlet}}")
}),
ThingsController: Em.ArrayController.extend({
thingTypes: (function() {
return App.ThingType.find();
}).property()
}),
ThingsView: Em.View.extend({
template: Em.Handlebars.compile([
'{{#each controller.thingTypes}}',
'{{this.name}}',
'{{/each}}',
'{{#each controller.content}}',
'{{this.title}}',
'{{/each}}'].join(""))
}),
//MODELS
Person: DS.Model.extend({
things: DS.hasMany('App.Thing', {
embedded: true …Run Code Online (Sandbox Code Playgroud) 干杯! 我有一些模型,它的一个属性是一个数组,但由于某些原因(我在服务器上使用mongoDB,这是嵌入式模型和ember数据的问题)我不能做这样的事情:
App.Foo = DS.Model.extend({
...
numbers: DS.hasMany('App.Bar')
)};
App.Bar = DS.Model.extend({
...
number: DS.attr('number')
});
Run Code Online (Sandbox Code Playgroud)
我需要这样的东西:
App.Bar = DS.Model.extend({
numbers: DS.attr('array')
});
Run Code Online (Sandbox Code Playgroud)
但是在ember-data中没有数组类型的属性,怎么样?
Ember.Route.model有权访问params变量,但Ember.Route.setupController没有.这对我来说很麻烦,因为我的路径有多个动态段,我需要在我的模板中使用所有这些段.
具体来说,我的路径如下:/project/:project_id/task/:task_id.请注意,任务可以属于许多项目,而不仅仅是一个.因此,我们不能告诉我们正在查看的项目只是查看任务本身:我们必须使用URL中找到的项目ID.这是我目前正在做的事情:
App.TaskRoute = Ember.Route.extend({
// This works just fine:
serialize: function(model) {
return {
task_id: model.get('id'),
project_id: this.modelFor('project').get('id')
};
},
model: function(params) {
this.set('parentProjectId', params.project_id);
return App.Task.find(params.task_id);
},
setupController: function(controller, model) {
var parentProject = this.modelFor('project') ?
this.modelFor('project') :
App.Project.find(this.get('parentProjectId'));
controller.set('parentProject', parentProject);
controller.set('content', model);
}
});
Run Code Online (Sandbox Code Playgroud)
也许我是偏执狂,这只是感觉hacky.如果路由是为了访问参数,那么它已经params附加了一个属性.有没有更好的办法?
编辑:我对上面的代码做了一些更新.此外,我的路线看起来像这样:
App.Router.map(function() {
this.resource('project', { path: '/project/:project_id' });
this.resource('task', { path: 'project/:project_id/task/:task_id' });
});
Run Code Online (Sandbox Code Playgroud) 我有以下型号:
App.Company = DS.Model.extend({
name: DS.attr('string'),
accounts: DS.hasMany('App.Account', {
inverse: 'company'
})
});
App.Account = DS.Model.extend({
login: DS.attr('string'),
first_name: DS.attr('string'),
last_name: DS.attr('string'),
email: DS.attr('string'),
password: DS.attr('string'),
password_confirmation: DS.attr('string'),
company: DS.belongsTo('App.Company')
});
Run Code Online (Sandbox Code Playgroud)
该公司被定义为嵌入在帐户中:
DS.RESTAdapter.map('App.Account', {
company: { embedded: 'always' }
});
Run Code Online (Sandbox Code Playgroud)
当我创建一个新帐户时,公司数据正确嵌入到帐户数据中,我看到了我期望在服务器端发出的POST请求:
Started POST "/accounts" for 127.0.0.1 at 2013-06-27 13:30:53 +0200
Processing by AdminUsersController#create as JSON
Parameters: {"account"=>{"login"=>"fsdfdf", "first_name"=>"fgdfgh", "last_name"=>"fsfdsfdsfsd@fgfdgdfgf.de", "email"=>"dsfdsgds@frgdfgfgdfg.de", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "company"=>{"name"=>"gfdhgtrhzrh"}}}
Run Code Online (Sandbox Code Playgroud)
但是,我也看到了公司本身的额外POST请求:
Started POST "/companies" for 127.0.0.1 at 2013-06-27 13:30:53 +0200
Processing by CompaniesController#create as JSON
Parameters: {"company"=>{"name"=>"gfdhgtrhzrh"}} …Run Code Online (Sandbox Code Playgroud) 在过去的几个小时里,我一直在努力解决这个问题,我正在制作一个用于创建发票的余烬应用程序.我正在使用ember组件(textfield)使用键盘修改字段,但由于操作不会发送回相关的控制器,我无法将记录保存在focusOut或insertNewLine上,并且没有任何事情发生.我在用 :
Ember : 1.1.2
Ember Data : 1.0.0-beta.3
Handlebars : 1.0.0
jQuery : 1.9.1
Run Code Online (Sandbox Code Playgroud)
这应该是这样的:https://dl.dropboxusercontent.com/u/7311507/embercomponent.png
问题似乎在控制器或组件内,似乎我缺少一些东西.
在组件上调用console.log函数,sendAction调用永远不会...
谢谢您的帮助.
App.ItemsRoute = Ember.Route.extend({
renderTemplate: function() {
// Render default outlet
this.render();
// render extra outlets
this.render("client", { outlet: "client", into: "application"});
},
model: function() {
return this.store.find('item');
}
});
Run Code Online (Sandbox Code Playgroud)
App.ItemsController = Em.ArrayController.extend({
actions: {
createItem: function () { // NEVER GETS CALLED FROM COMPONENT
var title = "Nouvel élément"
// Create the new Todo model
var …Run Code Online (Sandbox Code Playgroud) 我使用的是ember 1.3.1和ember-data 1.0.0-beta.5.在创建新模式时,我收到以下错误
断言失败:无法克隆未实现Ember.Copyable的Ember.Object
以下是我的型号代码
App.myModel = DS.Model.extend({name:DS.attr('string'),age:DS.attr('string')});
在我的创建路线模型功能
return Em.Object.create({});
最后保存我做了以下
this.store.createRecord('property',this.get('model'));
尽管出现错误,但我的后端服务已成功调用并保存了新模型.
请指导.
谢谢