我无法弄清楚如何删除由其创建的模型App.store.createRecord().看看这个小提琴:http://jsfiddle.net/Adw4F/2/
您可以删除从灯具(或其他适配器)加载的记录,但不能创建.
假设我有一个带有以下布局的Rails应用程序(从我的实际项目中简化了一下):
User
has many Notes
Category
has many Notes
Note
belongs to User
belongs to Category
Run Code Online (Sandbox Code Playgroud)
注释可以在以下位置获得:
/users/:user_id/notes.json
/categories/:category_id/notes.json
Run Code Online (Sandbox Code Playgroud)
但不是:
/notes.json
Run Code Online (Sandbox Code Playgroud)
在整个系统中有太多的Notes要在一个请求中向下发送 - 唯一可行的方法是仅发送必要的Notes(即,属于用户试图查看的用户或类别的Notes).
用Ember Data实现这个的最佳方法是什么?
我试图使用Ember和Ember/Data来显示从REST API返回的简单JSON.
这是我的js:
window.ManageClients = Em.Application.create();
ManageClients.store = DS.Store.create({
revision: 4,
adapter: DS.RESTAdapter.create({
bulkCommit: false,
namespace: "api"
})
});
ManageClients.Client = DS.Model.extend({
url: '/clients',
name: DS.attr('string'),
slug: DS.attr('string'),
programs: DS.attrArray('string'),
selfserve: DS.attrArray('string')
});
ManageClients.Clients = ManageClients.store.findAll(ManageClients.Client);
ManageClients.ClientsView = Em.View.create({
templateName: 'client-template'
});
ManageClients.ClientsView.appendTo('#ManageClients');
Run Code Online (Sandbox Code Playgroud)
我的模板:
<div id="ManageClients">
<script type="text/x-handlebars" data-template-name="client-template">
<ul>
{{#each ManageClients.Clients}}
<li>
{{#if isLoaded}}
Client:{{name}}
{{else}}
Loading...
{{/if}}
</li>
{{/each}}
</ul>
</script>
</div>
<script language="javascript" src="/js/manageClients.js"></script>
Run Code Online (Sandbox Code Playgroud)
错误:
Uncaught TypeError: Object ManageClients.Client has no method '_create' ember-data.js:1811
DS.Store.Ember.Object.extend.materializeRecord ember-data.js:1811
DS.Store.Ember.Object.extend.findByClientId …Run Code Online (Sandbox Code Playgroud) 更新Ember JS数组不会反映在视图中.
调节器
App.MyController = Ember.ArrayController.extend({
results: [],
init: function(){
_this = this
App.MyModel.find({}).then(function(contents) {
obj1 = contents.objectAt(0)
obj1.get('data').hasMany.results.forEach(function(item){
_this.results.push(item)
});
})
//rest of the code
}
})
Run Code Online (Sandbox Code Playgroud)
模板
{{#each results}}
// show items of reults.
{{/each}}
Run Code Online (Sandbox Code Playgroud)
这是我从服务器获取数据的代码片段,在加载时,我将其推入结果数组.从服务器加载数据需要一些时间,因此模板映射到空结果数组.理想情况下,结果数组应该更新模板中的内容,但逻辑上不应该更新.
有没有人知道我失踪的地方?或做错了.
提前致谢.
我正在为会计部门构建仪表板应用程序.
用户将选择一个月,并查看当月符合特定条件的所有公司.路线将是
/:month_id a summary page
/:month_id/companies more details about each company
/:month_id/companies/:company_id all details about a single company
Run Code Online (Sandbox Code Playgroud)
理想情况下,我有一个month模型hasMany company模型.唯一的问题是,公司将在几个月内出现.
如果我错了,请纠正我,但这是不是意味着如果公司已经在商店,当要求新的月份时,它将从商店而不是服务器获取该公司的数据?每个月的数据会有所不同,所以这对我不起作用.
我想在这个应用程序中,每个公司的id都是他们的正常,整数id加上选定的月份.因此,解决这个问题的方法之一就是给每个公司一个像'15-Mar-2013'.
或者,我可以companies通过原始数据传递每个月的数据,并在plain数组上进行转换.但问题是,我必须计算公司的总量(除了整个月),将这两件事分开是很好的.如果我有一个完全独立的公司模型,我可以在模型中去城镇:
App.Company = DS.Model.extend({
month: DS.belongsTo('App.Month'),
name: DS.attr('string'),
contracts: DS.hasMany('App.Contract'),
totalRevenue: function() {
return this.get('contracts')
.filterProperty('type', 'newSetup')
.getEach('feeChange').reduce(function(accum, item) {
return accum + item;
}, 0);
}.property('contracts.@each.feeChange'),
...additional aggregation functions
});
Run Code Online (Sandbox Code Playgroud)
你怎么看?
通过我的搜索,我没有找到满意的答案,所以我想我会在这里问.
我目前正在使用Ember.Js,Ember-Data和Ember-Firebase-Adapter,并尝试创建一个CRUD应用程序,它将创建一个父记录,然后创建后续子记录到所述父记录.
(请注意,DS.Firebase.LiveModel是Firebase适配器,相当于DS.Model/Ember.Model)
这是我的模型,改为通用的帖子/评论类型
App.Post = DS.Firebase.LiveModel.extend({
name: DS.attr('string'),
body: DS.attr('string'),
date: DS.attr('date'),
comments: DS.hasMany('App.Comment', {embedded: 'always'})
});
App.Comment = DS.Firebase.LiveModel.extend({
message: DS.attr('string'),
timestamp: DS.attr('string'),
post: DS.belongsTo('App.Post', {key: "post_id"})
});
Run Code Online (Sandbox Code Playgroud)
(我应该post_id= post?)
这是我创建的路线Comments:
App.PostsCommentRoute = Ember.Route.extend({
setupController: function(controller) {
controller.set('content', App.Comment.find());
}
});
Run Code Online (Sandbox Code Playgroud)
这是我的控制器PostsCommentRoute:
App.PostsCommentController = Ember.ObjectController.extend({
newMessage: null,
newTimestamp: null,
saveComment: function() {
App.Pbp.createRecord({
message: this.get('newMessage'),
timestamp: this.get('newTimestamp')
})
App.store.commit();
this.set('newMessage', null);
this.set('newTimestamp', null);
}
});
Run Code Online (Sandbox Code Playgroud)
我想我可能会错过序列化器?我已经阅读了几件事,addArray但我试图插入的东西并没有证明是富有成效的.因为我的评论很好,但是在我的JSON中它们与帖子无关.
有没有办法让创建 …
我正在教自己Ember并且在坚持我的孩子模特时遇到了问题.这是一个演示问题的JSBin:
http://jsbin.com/OnUXEti/2/edit?html,js,output
如果您使用它,您将能够创建帖子和评论,但只有帖子在页面重新加载后仍然可用.(我正在使用ember-data和localStorage适配器)
有两种模型类型,Post和Comment
App.Post = DS.Model.extend({
title: DS.attr('string'),
comments: DS.hasMany('comment')
});
App.Comment = DS.Model.extend({
message: DS.attr('string')
});
Run Code Online (Sandbox Code Playgroud)
每个帖子都有一系列评论.我打算在那里有以下网址:
/posts 将列出所有帖子/posts/1 将显示ID为1的帖子/posts/1/comments 将显示帖子1的评论 路由定义如下:
App.Router.map(function() {
this.resource("posts", { path: "/posts" });
this.resource("post", { path: "/posts/:post_id" }, function() {
this.resource("comments", { path: "/comments" });
});
});
Run Code Online (Sandbox Code Playgroud)
我可以毫无问题地将Post模型写入商店.我不能做的是保存评论模型.如果您使用上面的JSBin示例,您将看到可以创建注释,但在重新加载页面时它们不会保留.
我尝试在CommentsController中保存注释:
App.CommentsController = Ember.ArrayController.extend({
needs: "post",
post: Ember.computed.alias("controllers.post"),
newMessage: '',
actions: {
create: function() {
var message = this.get('newMessage');
var comment = this.store.createRecord('comment', {
message : message
}); …Run Code Online (Sandbox Code Playgroud) 详细信息:ember-data-1.0.0.beta.3和默认的RESTAdapter
我可能误解了该store.find()方法的工作原理,但是,根据我的理解,如果我要求的记录已存在于商店中,则以下代码不应查询服务器:
var IndexRoute = Em.Route.extend({
model: function() {
return this.store.find('link');
},
});
Run Code Online (Sandbox Code Playgroud)
从emberjs.com文档中DS.Store.find():
find方法将始终返回将使用记录解析的promise.如果记录已经在商店中,则承诺将立即得到解决.否则,商店将询问适配器的find方法以查找必要的数据.
我有另一条路径与完全相同的模型钩子,但当我访问该路线时,即使数据已经存储在商店中,服务器也会被查询.如果我回到Index路线,它会再次被查询.不应该.find()处理这个?
更新
演示:http://jsbin.com/ogorab/311/edit
我正在尝试构建一个简单的聊天室,使用Faye/Websockets实时更新.消息是使用常规REST发布的,但也有通过Faye订阅/ messages/created,store.pushPayload用于推送新消息.
现在发生以下情况,我可以看到它出错的地方,但我不知道如何解决它:
ChatController处理提交,createRecord使用聊天消息调用,然后#savecreateRecord).请注意,id还没有分配.这会导致重复的消息,按以下顺序:
createRecord,将通过ajax响应解决]pushPayload/ Faye 插入的消息]我希望你能理解到目前为止.解决方案是让Faye在推送有效负载之前等待保存调用解析.不幸的是,我没有对正在保存的记录的引用(发生在控制器中,faye订阅已设置ApplicationRouter).
另外我希望这能以通用的方式工作:)
我正在尝试通过POST对Ember Data 2.10的基于JSONAPI的API 的请求提交无效数据。
API用422代码和响应中的此有效负载正确响应(请注意,这些是错误对象,不是“正常” JSONAPI有效负载响应):
{
"errors": [{
"title": "Title can't be blank",
"id": "title",
"code": "100",
"source": {
"pointer": "/data/attributes/title"
},
"status": "422"
}, {
"title": "Layout can't be blank",
"id": "layout",
"code": "100",
"source": {
"pointer": "/data/relationships/layout"
},
"status": "422"
}, {
"title": "Page type can't be blank",
"id": "page-type",
"code": "100",
"source": {
"pointer": "/data/attributes/page-type"
},
"status": "422"
}]
}
Run Code Online (Sandbox Code Playgroud)
该错误似乎大部分都可以加载到模型中,但是我在控制台中收到此错误:
ember.debug.js:19160 Error: The adapter rejected the commit because it …Run Code Online (Sandbox Code Playgroud)