2013-02-08 39 views
1

我正在使用Ember 1.0.0 pre並使用REST適配器從Rails API中獲取對象。 如果通過REST API找到對象並將找到的模型對象設置爲視圖的模型,則呈現模板。爲了做到這一點,我使用了Route中的模型鉤子,一切似乎都正常。 當然,如果找不到模型對象,我想渲染一些特殊的404模板/視圖。 問題是,如果REST適配器返回錯誤,模型掛鉤會停止處理。如何處理未在Ember REST適配器中找到的404

我在ember-data路線圖中看到錯誤處理尚不受支持。

我不明白爲什麼Ember在發生錯誤時不會在路由中調用重定向鉤子。(?我怎樣才能處理這樣的錯誤)

這裏是路線:

App.MyRoute = Ember.Route.extend({ 
    renderTemplate: function() { 
    this.render('mymodel')  
    }, 
    model: function(params) { 
    return App.MyModel.find(params.id); 
    }, 
    redirect: function() { 
    // I want to redirect to another route 
    // if the model is not found via the find method. 
    // However, this hook is not called if the previous one 
    // does not return an object 
    } 
}) 

是否有任何其他的解決辦法?我知道,我可以檢查模板,如果視圖的模型是空的,然後渲染一個局部模板,但問題是視圖根本沒有渲染(我假設完全是因爲同樣的問題)。

回答

1

我會做的是創建一個抽象,然後讓你的路線延伸該路線。我有created a working JSFiddle for you,但請讓我解釋一下。

我們App.IndexRoute可以包含所有的邏輯在App.MyRedirectRoute,但由於其他路由器可能需要相同的功能,最好創建一個抽象的,所以如果/當你再次需要此功能,你可以再延長App.MyRedirectRoute防止再次 - 寫入代碼。

不幸的是,Ember.JS沒有邏輯來檢測模型是否爲空並呈現不同的頁面。也許將來這將成爲現實! (這將是可愛!),但我們可以自己做。

我們App.IndexRoute是好的和簡單:

App.IndexRoute = App.MyRedirectRoute.extend({ 
    defaultRender: 'home', 
    errorRedirectTo: '404', 

    model: function(params) { 
     // We've found a model! 
     return Ember.Object.create({ params: params }); 
     // We've not found a model! 
     return null; 
    } 
}); 

如果模型是有效的,那麼我們就可以呈現home路線,否則我們將呈現404路線。從路線返回模型沒有任何變化。

這是renderTemplate,其中包含我們的邏輯渲染適當的觀點。因此,我們因此在超負荷我們的抽象的renderTemplate方法,做邏輯的東西:

  • 如果模型由Ember.JS認爲是空的,然後我們將呈現由errorRedirectTo指定的視圖;
  • 如果模型被認爲有效,那麼我們將呈現默認值,如defaultRender所指定。

如果模型爲空,那麼我們就簡單地指定我們希望呈現的404路線(errorRedirectTo),但默認情況下,我們將要呈現的默認路由(defaultRender)。

要看到它的行動,看看前面提到的JSFiddle。註釋掉第27行以查看呈現的404頁面,因爲對象是null

我希望這有助於!

+0

感謝您的時間和長時間的迴應。事實上,這是按預期工作的。但是,如果我使用'App.MyModel.find(params.id);它不能用於開箱即用;'我最終檢查返回的對象是否具有「_data」屬性。如果是的話,我返回模型,如果沒有,我會返回null。你會考慮這個檢查安全嗎? – peshkira 2013-02-08 16:33:24

+0

我會這麼說,但如果您有任何與此有關的不尋常問題,請牢記這是一個可能的原因。 – Wildhoney 2013-02-08 16:57:59

+0

還有一些問題,但我認爲這些問題是由於餘燼數據造成的。因爲我決定不使用它,直到它穩定下來,你的解決方案似乎做得很好。再次感謝,我接受你的回答。 – peshkira 2013-02-21 08:57:26

相關問題