我有一个应用程序使用ember-data来持久化数据和StateManager来驱动它的全局状态.因为,加载数据是异步的,我想知道如何捕获表示所有数据都已加载的事件.确切地说,我有一个名为"loading"的状态,我在其中加载数据:
App.store.find(App.Model, ....)
Run Code Online (Sandbox Code Playgroud)
加载模型时,我会做一些后期处理.这是在名为"后处理"的"加载"子状态中完成的.当每个模型都有一个"didLoad"事件时,我转到"后处理":
App.Model = DS.Model.extend {
didLoad: ->
stateManager.send('postProcess',this)
}
Run Code Online (Sandbox Code Playgroud)
当加载和后处理每个数据时,应用程序应转换到与"加载"处于同一级别的另一个"编辑"状态:
loading -> postprocessing
root /
\
editing
Run Code Online (Sandbox Code Playgroud)
我应该抓住哪些事件来实现转型?ember-data Store是否有回调功能?
有没有一种方便的方法来检查从外部API传递到Ember js和Ember Data模型的原始模型数据?
类似Ruby .inspect方法的东西.对于Ember Data,有没有这样的调试工具?
我希望确保在数据到达我的Ember模型时正确映射到JSON.但是,在必须在Ember方面明确定义模型类中的属性之前,查看数据结构会很方便.
我想知道是否有类似于这种模式的东西:
App.Somedata = DS.Model.extend({
raw: this.inspect
});
Run Code Online (Sandbox Code Playgroud)
然后在我的模板中,我可以将它作为传达整个结构的属性转储到视图中.
{{#each item in controller}}
{{item.raw}}
{{/each}}
Run Code Online (Sandbox Code Playgroud)
这不是用于生产,而是仅用于尝试探索API的实现以及如何通过适配器提供API时的发现目的.
见JSFiddle:http://jsfiddle.net/cyclomarc/HKHEJ/2/
我正在从Ember数据0.13转换为1.0.0 beta.在以前的版本中,您可以使用transaction.rollback()来还原模型中所做的任何更改(尚未保存).
在1.0.0中,您可以使用record.rollback().我遇到的问题是当时所有属性都被清除了......
cancel: function () {
var author = this.get('model');
author.rollback();
},
Run Code Online (Sandbox Code Playgroud)
JSFiddle中的场景:单击名称,更改其中一个文本域中的文本,然后单击"还原更改".除id之外,所有字段都被清除.
这是一个已知的问题 ?
我正在开发一个Ember.js应用程序,目前我尝试实现用户注册.到目前为止,我找到了两种方法来实现这一点,但两者都有一些缺点.
一种方法是使用注册控制器,该控制器使用电子邮件,密码和密码确认值对服务器执行自定义ajax发布.我真的不喜欢这个地方的自定义ajax调用,我更喜欢使用EmberData用户模型并保存它,但我不想在客户端存储密码和密码确认值.
我发现,有一种方法可以从服务器接收模型的元数据,所以我的问题是,还有一种方法可以将元数据保存到服务器吗?
其他解决方案,无需在客户端存储密码也是受欢迎的.
我有以下三种型号:
ConversationApp.Post = DS.Model.extend(
body: DS.attr()
replies: DS.hasMany('reply', async: true)
author: DS.belongsTo('user', async: true)
likedBy: DS.hasMany('user', async: true)
)
ConversationApp.Reply = DS.Model.extend(
body: DS.attr()
post: DS.belongsTo('post')
author: DS.belongsTo('user', async: true)
likedBy: DS.hasMany('user', async: true)
)
ConversationApp.User = DS.Model.extend(
firstName: DS.attr()
lastName: DS.attr()
)
Run Code Online (Sandbox Code Playgroud)
我的索引路由进行此调用:
ConversationApp.IndexRoute = Em.Route.extend(
model: (args) ->
@store.find('post', page: 1) # => /api/v1/posts?page=1
)
Run Code Online (Sandbox Code Playgroud)
在进行该呼叫之后,Ember开始获取第一页所需的所有用户 - 在第一页上共有17个(!)不同的用户请求(具有10个帖子).以下是Ember向服务器发出的3个请求示例:
Ember数据将数据发送到嵌入了型号名称的服务器.
{
"part" {
"name" : "test1",
"quantity" : 12
}
}
Run Code Online (Sandbox Code Playgroud)
我想从响应中删除"part"字段,所以它看起来像:
{
"name" : "test1",
"quantity" : 12
}
Run Code Online (Sandbox Code Playgroud)
我需要这是通用的,所以它适用于我的商店中的任何模型.
好的,我找到了RESTAdapter中的部分.
serializeIntoHash: function(data, type, record, options) {
var root = underscore(decamelize(type.typeKey));
data[root] = this.serialize(record, options);
},
Run Code Online (Sandbox Code Playgroud)
我试图删除根部分
serializeIntoHash: function(data, type, record, options) {
data = this.serialize(record, options);
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用,它用{}响应
我想这个应该相当简单,但我还没有找到问题的根源,我还在学习Ember-Data.
我有两个模型,hasMany它们之间有关系:
App.User = DS.Model.extend({
displayName: DS.attr('string'),
email: DS.attr('string'),
firstName: DS.attr('string'),
lastName: DS.attr('string'),
location: DS.attr('string'),
messages: DS.hasMany('message')
});
App.Message = DS.Model.extend({
user: DS.belongsTo('user'),
createdAt: DS.attr('date'),
updatedAt: DS.attr('date'),
fullText: DS.attr('string'),
subject: DS.attr('string'),
recipients: DS.attr('string')
});
Run Code Online (Sandbox Code Playgroud)
Ember-data从服务器检索用户,输出如下:
{
"user":[
{
"id":"3",
"firstName":"A",
"lastName":"User",
"location":"",
"email":"a@user.com",
"displayName":"auser",
"messages":[
{
"id":"3",
"user":"3",
"createdAt":"2014-08-06 20:08:38",
"fullText":"Here is some text",
"recipients":"",
"subject":"Message subject (may not be needed)",
"updatedAt":"2014-08-06 20:08:38"
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
但是,当Ember尝试使用此响应填充商店时,我收到以下错误:
Error while loading route: TypeError: Cannot read property 'typeKey' …Run Code Online (Sandbox Code Playgroud) 有没有一种常规方法可以在Ember Data中查找单例?我已GameState根据这些说明(在"Singular"下)为我的模型设置了适配器:https://stackoverflow.com/a/23974804/173630
现在,当我获取GameState时,我希望能够这样做:
store.find('gameState');
Run Code Online (Sandbox Code Playgroud)
但是,它会findAll在Ember Data 中启动一个请求类型,它需要一个数组,而不是一个对象.
我的另一个选择是做这样的事情:
store.find('gameState', 'mine');
Run Code Online (Sandbox Code Playgroud)
该mine参数被忽略,但这将成功获取并加载我的GameState.这里的缺点是Ember Data GameState在我的商店中创建了一个id为的额外实例mine.有什么方法可以防止这种情况吗?
我正在使用Ember Data 1.0.0-beta.11.
这是我的模型的样子:
var GameState = DS.Model.extend({
currentPuzzle: DS.belongsTo('puzzle'),
currentRound: DS.belongsTo('puzzleRound'),
currentInventory: DS.attr('number'),
moves: DS.hasMany('move', {async: true}),
createdAt: DS.attr('date'),
updatedAt: DS.attr('date')
});
Run Code Online (Sandbox Code Playgroud) 我的产品型号有很多价格.我有一个页面显示产品名称,代码,然后显示它的价格数量,即:
<tbody>
{{#each model as |product id|}}
<tr>
<td>{{#link-to "product" product}}{{product.name}}{{/link-to}}</td>
<td>{{product.code}}</td>
<td>{{product.prices.length}}</td>
</tr>
{{/each}}
</tbody>
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,使用product.price.lengthEmber数据会产生数千个按ID获取价格的请求.我不需要任何有关此页面上实际价格的信息.如果没有Ember数据下载所有价格,我怎么能在这里使用长度属性?
车型/ product.js:
export default DS.Model.extend({
code: DS.attr('string'),
name: DS.attr('string'),
prices: DS.hasMany('price', {async: true})
});
Run Code Online (Sandbox Code Playgroud)
车型/ price.js
export default DS.Model.extend({
product: DS.belongsTo('product', {async: true}),
value: DS.attr('number'),
minUnits: DS.attr('number'),
maxUnits: DS.attr('number')
});
Run Code Online (Sandbox Code Playgroud) 我在ApplicationController中有搜索属性,并且它与搜索的输入字段链接.我想在ProjectController中访问ApplicationController的搜索字段.它应该是同步的.我使用以下代码,但它不起作用.
/ app/controllers/projects/index.js(项目控制器)
import Ember from 'ember';
export default Ember.Controller.extend({
needs: ['application'],
searchBinding: 'controllers.application.search'
});
Run Code Online (Sandbox Code Playgroud)
/ app/controllers/application.js(应用程序控制器)
import Ember from 'ember';
export default Ember.Controller.extend({
search: ''
)}
Run Code Online (Sandbox Code Playgroud)
application.hbs
{{input value = search}}
ember.js ember-data ember-controllers ember-cli ember-components