1

私は Ember 1.0.0 pre を使用しており、REST アダプターを使用して Rails API からオブジェクトを取得しています。REST API 経由でオブジェクトが見つかった場合はテンプレートをレンダリングし、見つかったモデル オブジェクトをビューのモデルとして設定します。そのために、Route でモデル フックを使用すると、すべて正常に動作するようです。当然、モデル オブジェクトが見つからない場合は、特別な 404 テンプレート/ビューをレンダリングしたいと考えています。問題は、REST アダプターがエラーを返すと、モデル フックが処理を停止することです。

エラー処理がまだサポートされていないことを ember-data ロードマップで確認しました。

私が理解できないのは、エラーが発生した場合に Ember が Route でリダイレクト フックを呼び出さない理由です。(そして、どうすればそのようなエラーを処理できますか?)

ルートは次のとおりです。

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
  }
})

他の解決策はありますか?ビューのモデルがnullの場合はテンプレートをチェックインしてから部分テンプレートをレンダリングできますが、問題はビューがまったくレンダリングされないことです(同じ問題が原因だと思います)。

4

1 に答える 1

1

私がすることは、アブストラクトを作成し、ルートをそのルートに拡張させることです。動作するJSFiddleを作成しましたが、説明させてください。

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、abstract でメソッドをオーバーロードし、ロジックを実行します。

  • モデルが Ember.JS によって空であると見なされた場合、ビューをerrorRedirectTo;で指定されたとおりにレンダリングします。
  • モデルが有効であると見なされた場合は、 で指定されたデフォルトをレンダリングしますdefaultRender

モデルが空の場合は、単に 404 ルート ( errorRedirectTo) をレンダリングすることを指定しますが、デフォルトではデフォルト ルート ( defaultRender) をレンダリングする必要があります。

実際の動作を確認するには、前述の JSFiddle をご覧ください。27 行目をコメントアウトして、オブジェクトがnull.

これが役立つことを願っています!

于 2013-02-08T15:23:34.553 に答える