Ember在模型钩子

时间:2015-06-15 18:30:07

标签: ember.js ember-data

我希望能够在URL中输入其ID时检索某个对话。如果对话不存在,我想显示一条记录未找到的警告消息。

这是我的模型钩子:

model: function(params){
    return this.store.filter('conversation', { status : params.status}, function(rec){
        if(params.status == 'all'){
            return ((rec.get('status') === 'opened' || rec.get('status') === 'closed'));
        }
        else{
            return (rec.get('status') === params.status); <--- Problem is here
        }
    });
}

例如,如果我想直接访问某个对话,我可以这样做:

dev.rails.local:3000/conversations/email.l@email.com#/convid

问题是,当我输入一个不存在的会话ID(如asdfasdf)时,ember会调用不存在的后端路由。

调用GET conversation / asdfasdf。我确定这只是因为记录不存在。我在路由器中嵌套了资源,因此我也确定它会尝试使用不存在的ID检索对话。

基本上,我想在从钩子返回内容之前验证对话的存在。请记住,我的模型钩子几乎已经设置好并且不会发生变化,除了在url中添加与对象存在的验证。这背后的原因是项目几乎完成,一切都基于这个钩子。

这是我的路由器(有些人会告诉我你不能使用嵌套资源,但是我会这样做,它会保持这样,所以我必须使用它,因为我&# 39;我在一个项目上工作,我只需要在本节中集成ember,我必须使用这个设置):

App.Router.map(function(){
    // Routing list to raw namespace path
    this.resource('conversations', { path : '/' }, function() {
        this.resource('conversation', { path : '/:conversation_id'});
    });
});

当我没有指定任何ID时也会发生这种情况,我在我的网址中使用了这样的主题标签:

dev.rails.local:3000/conversations/email.l@email.com#/会打电话给对话/

我知道这是因为我的嵌套资源。我该怎么办?

2 个答案:

答案 0 :(得分:3)

通过将query传递给filter(您的{ status : params.status}),您要求 Ember Data进行服务器查询。尝试删除它。

来自http://emberjs.com/api/data/classes/DS.Store.html#method_filter的文档:

  

您可以选择传递一个查询,相当于使用相同的查询调用find,以从服务器获取其他记录。如果服务器返回的结果与过滤器功能匹配,则它可以显示在过滤器中。

因此,请删除查询:

model: function(params){
    return this.store.filter('conversation', function(rec) {
        if (params.status == 'all') {
            return rec.get('status') === 'opened' || rec.get('status') === 'closed';
        } else {
            return rec.get('status') === params.status;
        }
    });
}

答案 1 :(得分:0)

好的,这就是我的所作所为。我删除了我的嵌套资源,因为我意识到除了重定向我的网址之外我没有使用它。我决定使用javascript window.location手动重定向我的网址。

这删除了不需要的调用(由嵌套资源引起)。

感谢torazaburo,你睁开了许多眼睛。