当Ember Data通过模板访问许多属性时处理被拒绝的承诺

时间:2014-06-03 13:57:39

标签: ember.js ember-data

当'findHasMany'调用失败时,是否存在处理错误的标准方法?使用案例:

Model: App.User
{
DS.hasMany('comments', {'async': true});
}

模板

{{#each comment in comments}}
<p>{{comment.title}}</p>
{{/each}}

问题在于,当延迟加载注释失败时,例如由于某些服务器问题,我希望能够在UI中响应该错误(通过路由到其他地方,在页面上显示有关错误的弹出窗口等)。目前承诺只是拒绝。对于像这样的情况,我认为Ember Data可能会在ManyArray上有一些钩子,但它似乎并没有,并且商店似乎没有准确定义在这种情况下执行的操作:https://github.com/emberjs/data/blob/v1.0.0-beta.8/packages/ember-data/lib/system/store.js#L1758 - 承诺给出了'解决'方法,但不是拒绝方法。

我的选项似乎是对商店进行子类化,并在那里添加一些拒绝代码,或者继承DS.PromiseArray并观察'isRejected'属性。任何想法都会非常受欢迎!

编辑: 这个问题似乎归结为以下事实:当处理路由中定义的模型时,Ember和Ember Data可以很好地协同工作(您可以在错误操作中捕获拒绝承诺),直接通过模板的异步请求没有类似的结构。一种解决方案可能是让控制器中的观察者观察到类似'model.isError'的内容,但是失败的hasMany关系不会在拥有模型上触发错误。我想我可以做'comments.isRejected',但同样,我必须为每个具有hasMany关系的模型的控制器编写代码,换句话说,所有这些,这似乎都不是很令人满意。如果模型具有可观察的可枚举属性(例如“hasManyIsError”:{comments:false,posts:true}),那么使用'hasManyIsError.length

可以很容易地观察到它们中的任何一个

1 个答案:

答案 0 :(得分:0)

假设已经获取了一个名为user的var,你可以这样做:

var itWorked = function(comments) { return comments; }
var itFailed = function(error) { return error; }

user.get("comments").then(itWorked, itFailed);

async:true表示它会使用一个承诺...所以你可以使用那么......你不能在没有指定async的关系上这样做:true。 / p>

[编辑]抱歉,我刚刚意识到,当你的评论请求失败时,无论你放入itFailed函数中的任何内容都会评估,并且同样与itWorked相反......:)