对于我用ember-data做的大多数事情似乎就是这种情况,简单的测试用例非常简单,但由于我缺乏理解(我认为文档),任何"真实"都会迅速崩溃.在最简单的情况下,我可以创建新记录并将其保存到我的REST API.我将使用普遍的水果篮示例,然后开始只保存一个新的fruit.
// Here is our fruit model
module.exports = App.Fruit= DS.Model.extend({
name: attr('string'),
color: attr('string')
});
// This is easy to create and save
var fruit = this.store.createRecord('fruit', {
name: 'apple',
color: 'red'
});
fruit.save().then(successCallback, errorCallback);
Run Code Online (Sandbox Code Playgroud)
好的,我在这里没问题.在概念上有意义,代码很干净,而且看起来很好看!现在假设我们有一个basket模型,该basket模型可以容纳很多fruit.此外,用户可以创建新的fruit并将其添加到basket尚未在UI的一步中创建的新的.
所以这里有新车型:
module.exports = App.Fruit= DS.Model.extend({
name: attr('string'),
color: attr('string')
basket: DS.belongsTo('basket')
});
module.exports = App.Basket = DS.Model.extend({
fruits: DS.hasMany('fruit', {async:true})
});
Run Code Online (Sandbox Code Playgroud)
鉴于上述情况,假设用户输入了两个当前不存在于商店或后端REST API中的新结果,将它们添加到他的新购物篮(现在还不存在)中,然后点击"保存" .
如何使用Ember Data创建此记录?我希望你能做到这样的事情:
var newFruits = Ember.A(); …Run Code Online (Sandbox Code Playgroud) 当模型包含数组时,是否有必要使用DS.hasMany指向DS.Model?即使数组元素不是真正的模型(没有自己的ID或端点)?有没有更好的办法?
我正在使用DS.hasMany,但我的扩展DS.RESTAdapter是给我一个404试图访问该模型,即使我从来没有打电话find给它,并被hasMany称为{ embedded: true }.我第一次看到这个错误(显然与这个模型有关,因为没有它就会消失):
Uncaught Error: assertion failed: Emptying a view in the inBuffer state is not allowed and should not happen under normal circumstances. Most likely there is a bug in your application. This may be due to excessive property change notifications. ember-latest.js:43
Run Code Online (Sandbox Code Playgroud)
这意味着什么以及可能导致什么呢?
这是堆栈跟踪:
Ember.assert ember-latest.js:43
Ember.View.states.inBuffer.empty ember-latest.js:13644
Ember.View.Ember.Object.extend.invokeForState ember-latest.js:12257
Ember.CollectionView.Ember.ContainerView.extend.arrayWillChange ember-latest.js:14477
invokeAction ember-latest.js:3193
iterateSet ember-latest.js:3175
sendEvent ember-latest.js:3323
Ember.Array.Ember.Mixin.create.arrayContentWillChange ember-latest.js:6963
Ember.ArrayProxy.Ember.Object.extend.arrangedContentArrayWillChange ember-latest.js:9281
Ember.ArrayProxy.Ember.Object.extend._arrangedContentWillChange …Run Code Online (Sandbox Code Playgroud) 一个最近的余烬数据博客更新已建议看看烬模型,烬,坐立不安,和鸸鹋以替代恩贝尔数据与传统的API进行通信.能否请您对这些库进行深入比较?
我正在使用新的路由器和ember数据转11.
我需要强制ember-data从服务器重新加载记录数据.App.MyRecord.find在setInterval函数中使用(2)加载来自客户端本地存储的数据.
如何从服务器重新加载数据?
我正在使用ember-data作为我的一个项目,我有一个问题围绕着污染对象的可能性,然后故意将其状态再次设置为清理 - 而不是提交更改.场景是这样的:
假设我已经获取了一个对象,banana = App.Fruit.find('banana');并且它描述了"黄色水果!".使用XHR长轮询(或WebSockets),我可能会收到对象的更新版本,因为另一个用户已将描述更改为"美味的黄色水果!" 在我取出原始对象后的任何给定时间点.
然后,我想要做的是更新对象以反映新接收的数据.为此,我尝试了不同的方法:
我试过打电话App.Store.load(App.Fruit, new_data);.首先,这种方法不起作用,其次,这不是我想要的.我本可以对对象进行未经提交的更改,在这种情况下,放弃那些(假设load()调用会覆盖它们)是不可取的.
我已经尝试循环遍历新数据,调用.set()- 如下所示:banana.set('description', new_data.description);- 以便用新数据更新对象属性(适用时=不脏).这有效,但它使物体处于脏污状态.
为了使对象再次清理/更新 - 并且没有适配器提交更改! - 我看了一下物体穿过的状态.这些(至少):
rootState.loaded.saved状态..set()属性将其推送到rootState.loaded.updated.uncommitted状态.App.store.commit();将对象返回到rootState.loaded.saved状态.因此,我试图对象状态手动设置为saved步骤2之后,如下所示:banana.get('stateManager').goToState('saved');.
但是,这不起作用.下次商店因任何其他原因而提交时,此操作会产生inFlightDirtyReasons未定义错误.
我的问题是:如何再次手动将脏污物体的状态更改为清洁(保存)?
我正在使用Ember-Data Rest-Adapter,从我的服务器返回的JSON看起来基本上与Active Model Serializers文档中的JSON相似
{
"meta": { "total": 10 },
"posts": [
{ "title": "Post 1", "body": "Hello!" },
{ "title": "Post 2", "body": "Goodbye!" }
]
}
Run Code Online (Sandbox Code Playgroud)
从服务器获取数据有效,但遗憾的是我无法确定从JSON响应中访问元信息的位置.
根据我对ember-data的github问题的研究,对meta信息的支持似乎是通过commit 1787bff 实现的.
但即使有测试用例,我也无法弄清楚如何访问元信息.
App.PostController = Ember.ArrayController.extend({
....
requestSearchData: function(searchParams){
posts = App.Post.find(searchParams);
this.set('content', posts);
// don't know how to access meta["total"]
// but I want to do something like this:
// this.set('totalCount', meta["total"])
}
})
Run Code Online (Sandbox Code Playgroud)
你们中的任何人都可以为我阐明一下吗,拜托?我知道Ember api正在快速移动,但我确信我只是错过了一小部分而且这实际上是可能的.
当我在ember-data中为模型定义属性时,是否可以指定默认值?
ember-data 模型定义建议属性定义如下:
attributeName: DS.attr('number')
Run Code Online (Sandbox Code Playgroud)
...使用可选的第二个参数作为选项哈希.我查看了代码,但是我的代码阅读技巧无法确定我可以在选项哈希中添加哪些属性.可以这样做吗?
attributeName: DS.attr('number', { default: 0 })
Run Code Online (Sandbox Code Playgroud)
要么
attributeName: DS.attr('boolean', { default: false })
Run Code Online (Sandbox Code Playgroud)
?
更新#2
我发现当我重构过滤逻辑发生在PostController中的复合计算属性而不是在单个路径中时,我能够让它工作.解决方案最终依赖于由特定的#linkTo路由操作设置的单个动态变量,该操作触发了PostController计算属性中的过滤更改.我有很多工作需要赶上,所以我现在无法将解决方案发布到这个具体问题,但是当我可以时,我将详细解释下面的解决方案.现在我已经将@ twinturbo的答案标记为正确的,因为他在下面给出了部分但非常有用的指导.再次感谢男人!! 非常感激!!
更新#1
最新的小提琴是在http://jsfiddle.net/aZNRu/14/与@ twinturbo的帮助,在其后期父控制器中排序注释的"rank"属性,以及基本过滤.仍然存在在过滤的路线中没有获得自动更新视图并且创建新评论的问题.
原始问题
我看到有关将可排序mixin与过滤功能相结合的讨论,但就目前而言,正如您在我的jsfiddle示例中所看到的,我在排序和过滤方面都存在问题:
1)我无法弄清楚如何按其父控制器中的特定子属性进行排序.如果我们有:
App.Post = DS.Model.extend({
title: DS.attr('string'),
post: DS.attr('string'),
comments: DS.hasMany('App.Comment')
});
App.Comment = DS.Model.extend({
post: DS.belongsTo('App.Post'),
description: DS.attr('string'),
isActive: DS.attr('boolean'),
rank: DS.attr('number')
});
App.Router.map(function() {
this.resource("posts", { path: "/" }, function() {
this.resource('post', { path: ':post_id' }, function() {
this.route('active');
this.route('inactive');
});
});
});
Run Code Online (Sandbox Code Playgroud)
我希望能够按照"rank"属性按升序对每个帖子的评论进行排序.我想做的事情如下:
App.PostController = Ember.ObjectController.extend({
sortProperties: ['comments.rank']
Run Code Online (Sandbox Code Playgroud)
但是对于一个,我认为sortProperties只适用于arrayControllers,我认为它不能超过一个级别.我怎么能实现这个目标?
2)第二个问题是在过滤后的路由中没有获得自动更新视图.例如,如果您通过单击"活动注释"查看jsfiddle并进入活动过滤路径,则会对当前数据产生良好的过滤效果.但是,如果您保持活动路径并通过单击"添加新注释"创建一个处于活动状态的新记录,则该记录不会自动呈现在"活动"下,并且仅在您单击另一个路径然后返回到该路径时才会显示.
我是否在路由中错误地设置路由过滤或在模板中引用错误?
App.PostActiveRoute = Ember.Route.extend({
setupController: function() {
var post = this.controllerFor('post').get('model'),
comments = …Run Code Online (Sandbox Code Playgroud) 我使用Ember 1.13.7和Ember Data 1.13.8,默认情况下使用JSON-API标准格式化发送到API和从API接收的有效负载.
我想使用Ember Data的内置错误处理,以便向用户显示红色"错误"表单字段.我根据JSON-API标准格式化了我的API错误响应,例如
{"errors":[
{
"title":"The included.1.attributes.street name field is required.",
"code":"API_ERR",
"status":"400",
}
]}
Run Code Online (Sandbox Code Playgroud)
当我尝试保存我的模型时,正确执行错误回调.如果我在Ember Inspector中查看,我可以看到模型的"isError"值设置为true但我看不出Ember Data应该如何知道模型中哪个字段是错误状态的字段?我从官方JSON-API页面(http://jsonapi.org/format/#errors)中看到,您可以在错误响应中包含"源"对象:
source:包含对错误源的引用的对象,可选地包括以下任何成员:
指针:请求文档中关联实体的JSON指针[RFC6901] [例如,主数据对象的"/ data",或特定属性的"/ data/attributes/title"].
parameter:一个字符串,指示导致错误的查询参数.
但这是我应该做的,以便告诉Ember Data哪些字段应该标记为处于错误状态?
如果有人能帮助阐明这一点,我将不胜感激.
谢谢.
我很难理解在以下场景中使用的工作流程:
用户创建模型,我们称之为Product.我们为它们提供了一个表单来填写.由于某些原因除了验证之外的保存错误(超时,访问被拒绝等等)在Ember中,这会使模型进入错误状态.从UI的角度来看,我想要做的就是在屏幕上显示一条消息(简单)并允许用户再次尝试(显然不那么容易).
我已经多次写过它不会重复使用事务.我理解这个的逻辑.对于新产品,我简单地创建另一个新产品,合并来自原始产品(属性,关系)的数据,并用新产品替换我的控制器的内容.虽然可能(希望)有更好的方法,但这并不难,看起来效果很好.
但是,当我编辑产品时,我遇到了一个严重的问题,上述解决方案无效.产品模型现在处于错误状态,我找不到任何方法来获取不同状态的此产品的副本.
我无法弄清楚的是,一旦它遇到错误状态,我可以用这个模型做什么.我尝试过以下方法:
回滚:这不起作用.您无法在错误状态下回滚事务.
重新加载:与上述相同.不允许在错误状态下重新加载记录.
获取记录的新副本:所以我尝试使用与现有记录相同ID的App.Product.find(id).它只是给我一个错误状态的现有记录的副本.
我希望我在这里遗漏一些相当基本的东西.是否可以很好地从错误状态(或无效状态)滚动记录?
如果有一种简单的方法来改变这些模型的状态,我们是否还应该为进一步的提交尝试创建一个新的事务?