通过阅读文档,您似乎必须(或应该)将模型分配给路径,如下所示:
App.PostRoute = Ember.Route.extend({
model: function() {
return App.Post.find();
}
});
Run Code Online (Sandbox Code Playgroud)
如果我需要在某个路线中使用多个物体怎么办?即帖子,评论和用户?如何告诉路由加载这些?
我使用Ember.js与本地存储适配器.更新记录时我遇到了一个奇怪的问题.
我有一个与hasMany关系的帖子和评论模型:
App.Post = DS.Model.extend({
title: DS.attr('string'),
comments: DS.hasMany('comment', {
async: true
})
});
App.Comment = DS.Model.extend({
message: DS.attr('string')
});
Run Code Online (Sandbox Code Playgroud)
这些是我的帖子和评论控制器:
App.PostsController = Ember.ArrayController.extend({
newTitle: '',
actions: {
create: function() {
var title = this.get('newTitle');
var post = this.store.createRecord('post', {
title: title
});
this.set('newTitle', '');
post.save();
}
}
});
App.CommentsController = Ember.ArrayController.extend({
needs: "post",
post: Ember.computed.alias("controllers.post.model"),
newMessage: '',
actions: {
create: function() {
var message = this.get('newMessage');
var comment = this.store.createRecord('comment', {
message: message
});
var post = this.get('post');
var …Run Code Online (Sandbox Code Playgroud) 我有一个视图,其中可以有大量的项目供用户滚动,我想实现无限滚动以启用内容的渐进加载.
看起来有些人已经完成了分页,但谷歌没有提出任何讨论他们如何使用Ember/Ember Data完成无限列表的人.任何人都已经完成了这个并有一个博客文章/示例代码分享?
据我所知,在ember CLI中测试ember-data模型时,必须列出所有关系needs.如果结构简单,这很好,但在许多情况下会有多个层.
例如,如果设置了模型,并定义了以下关系:
Model a:
belongsTo: b
belongsTo: c
Model b:
hasMany: a
hasMany: d
Model c:
hasMany: a
belongsTo: e
Model d:
hasMany b
Model e:
hasMany c
Run Code Online (Sandbox Code Playgroud)
然后,对于任何这些模型的每个单元测试都将需要列出的所有其他模型needs,例如:A测试c:
needs: [
'model:a' // Because c -> a
'model:e' // Because c -> e
'model:b' // Because c -> a -> b
'model:d' // Because c -> a -> b -> d
]
Run Code Online (Sandbox Code Playgroud)
14个模型的实际配置要复杂得多,每个模型间接与其他模型相关.
我的理解是否正确?有更有效的方法吗?或者有一个很好的理由这样做我错过了吗?
说我有两个型号,Topic并且Post:
App.Topic = DS.Model.extend({
posts: DS.hasMany('post', { async: true, inverse: 'post' });
});
App.Post = DS.Model.extend({
topic: DS.belongsTo('topic', { async: true });
});
Run Code Online (Sandbox Code Playgroud)
主题hasMany帖子和帖子belongsTo主题.
要从API加载数据,需要进行一次初始调用(例如,获取主题...主题ID 2):
GET /topics/2
在接收到该GET请求的有效负载之后,串行器然后将links密钥附加到有效负载.这有加载与主题相关的帖子的路线:
"topic": {
"id": 2,
"links": {
"posts": "/topics/2/posts"
}
}
Run Code Online (Sandbox Code Playgroud)
第二个请求(to /topics/2/posts)是Posts加载和附加到主题的方式.
首次加载页面时,这一切都正常.
在页面会话期间创建Post时会发生此问题.虽然我可以让主题本身重新加载(通过调用.reload()代表主题的模型对象),但不会重新加载Posts与主题相关联的主题.第二API调用(获取职位)是从来没有制成,而在第一次调用(得到公正的话题)的制作.如果我刷新页面,我在上一页加载时创建的帖子将加载(但当然,如果我再去做一些帖子,它们将在下一页加载之前不显示).
寻找解决方案,我遇到了这个问题: 如何使用链接重新加载异步hasMany关系?
但是,似乎该解决方案不再适用于当前版本的Ember/Ember-Data.提供的JSFiddle不起作用.
那么,我怎样才能重新加载这种hasMany关系呢? 任何帮助是极大的赞赏.
我有一个组件,当用户点击组件它添加一些值存储,我尝试使用这种方式,但我得到一个错误:
OlapApp.MeasureListItemComponent = Ember.Component.extend({
tagName: 'li',
isDisabled: false,
attributeBindings: ['isDisabled:disabled'],
classBindings: ['isDisabled:MeasureListItemDisabled'],
actions: {
add: function(measure) {
var store = this.get('store');
store.push('OlapApp.AxisModel', {
uniqueName: measure.uniqueName,
name: measure.name,
hierarchyUniqueName: measure.hierarchyUniqueName,
type: 'row',
isMeasure: true,
orderId: 1
});
}
}
});
Run Code Online (Sandbox Code Playgroud)
这是错误的:
Uncaught TypeError: Cannot call method 'push' of undefined MeasureListItemComponent.js:18
Run Code Online (Sandbox Code Playgroud)
将记录从组件中存储起来是否可行?为什么我不能进入商店?我的模型名称是'AxisModel',应用程序命名空间是'OlapApp'
我正在尝试为Ember.js应用程序编写一个基于custom.js的自定义服务器.我相处得很好,但是我一直在试图猜测Ember Data在特定时刻所期待的JSON响应.
这个全新的文档是一个很好的开始http://emberjs.com/guides/models/the-rest-adapter/但不够完整.
我在黑暗中的刺伤让我明白了(Ember pre4,Ember Data 11):
Context Server URL Method Req. Data Resp. Data
~~~~~~~ ~~~~~~~~~~ ~~~~~~ ~~~~~~~~~ ~~~~~~~~~~
Getting a list of all users /users GET {"users":[{...},{...}]}
Getting a particular user /users/123 GET {"user":{...}}
Creating a user /users POST {"user":{...}} ???
Updating a user /users/123 PUT {"user":{...}} ???
Deleting a user /users/123 DELETE ??? ???
Creating a user (bulkUpdate) /users POST {"users":[{...},{...}]} ???
Updating a user (bulkUpdate) /users/bulk PUT {"users":[{...},{...}]} ???
Deleting a user (bulkUpdate) /users/123 …Run Code Online (Sandbox Code Playgroud) ember-data.js:https://github.com/emberjs/data/tree/0396411e39df96c8506de3182c81414c1d0eb981
简而言之,当出现错误时,我想在视图中显示错误消息,然后用户可以1)取消,这将回滚事务2)纠正输入错误并成功提交事务,传递验证服务器.
以下是来自源代码的代码段.它不包含错误回调.
updateRecord: function(store, type, record) {
var id = get(record, 'id');
var root = this.rootForType(type);
var data = {};
data[root] = this.toJSON(record);
this.ajax(this.buildURL(root, id), "PUT", {
data: data,
context: this,
success: function(json) {
this.didUpdateRecord(store, type, record, json);
}
});
},
Run Code Online (Sandbox Code Playgroud)
总的来说,从服务器接收错误和更新视图的流程是什么?似乎错误回调应该将模型置于一个isError状态,然后视图可以显示相应的消息.此外,交易应该保持脏.这样,交易就可以使用了rollback.
不过,似乎使用store.recordWasInvalid正朝着正确的方向发展.
我有一个关于使用Ember加载和缓存远程对象的问题.我正在开发一个Ember应用程序,它通过REST API使用服务器端存储.某些获取的数据很少更改,因此每次加载应用程序时都不需要从服务器获取数据.但这也是需要脱机工作并仍然将其数据保存到服务器的应用程序的问题.
Ember Data有一个内置的存储适配器,用于通过REST API保持模型,还有一个适用于本地存储的适配器(如下面Ken所指出的).问题(如果它是一个问题)是一个模型只有一个存储适配器,似乎没有任何缓存提取模型的概念,除了将它们保留在内存中.
我在这个Ember愿望清单和Tom Dale对此演讲的评论中发现了类似的请求,但我没有发现任何迹象表明这将是Ember的现有功能.
我有两个问题(第一个是重要问题):
谈到1),我可以想到几个策略:
a)扩展现有适配器并添加自定义远程同步机制:
App.Store.registerAdapter('App.Post', DS.LSAdapter.extend({
// do stuff when stuff happens
}));
Run Code Online (Sandbox Code Playgroud)
b)维护单独的模型类 - 一组用于远程对象,一组用于本地对象 - 并根据需要在它们之间进行同步.使用标准Todo案例:
RemoteTodo –*sync*– Todo
|
UI
Run Code Online (Sandbox Code Playgroud)
我有点希望这是一个真正的菜鸟问题,并且有一个很好的既定模式.
更新:发现了类似的问题.它有一个很好的答案,但它是理论上的.我认为我需要的是一些动手技巧或示例实现的指针.
我想在ember-data中缓存查询结果.(findQuery)
说清楚:我不想缓存整个模型; 只是什么模型是查询的结果.这个地方适合哪个地方?
我正在考虑在适配器中实现它并缓存AJAX调用的结果,但我不认为这是一个很好的解决方案,因为我不想覆盖加载的,可能更新和/或修改的模型数据.
我不认为只能返回一个ID列表,并且操纵适配器和串行器这个简单的用例似乎很混乱!
实际上我不希望findQuery调用特定类型的查询.喜欢的行为findAll.尼斯会像queryShouldBeCached钩子一样.
有一个很好的解决方案吗?
ember-data ×10
ember.js ×10
javascript ×3
caching ×1
ember-cli ×1
ember-router ×1
has-many ×1
jquery ×1
lazy-loading ×1
unit-testing ×1