2013-01-06 14 views
5

コード

新しいルータでバージョン4fcdbf2560を使用しています。アプリケーションテンプレートを新しいルータで再レンダリングするにはどうすればよいですか?

私のアプリケーションでは、ユーザーは認証されていてもいなくてもかまいません。レンダリングされたテンプレートは、認証ステートによって異なります。

私はApplicationRouteに機能renderTemplateを再定義することによって、これを管理してきました:

App.ApplicationRoute = Ember.Route.extend({ 
    renderTemplate: function() { 
     this.render(App.authenticated() ? 'authenticated' : 'unauthenticated'); 
    } 
}); 

私のルーターは非常に簡単です:

App.Router.map(function(match) { 
    match('/').to('index'); 

    match('/sign').to('sign', function(match) { 
     match('/in').to('signIn'); 
    }); 

    match('/dashboard').to('dashboard'); 
}); 

IndexRouteはに応じて、ユーザーをリダイレクトするだけでここにあります認証状態:

App.IndexRoute = Ember.Route.extend({ 
    redirect: function() { 
     this.transitionTo(App.authenticated() ? 'dashboard' : 'signIn'); 
    } 
}); 

ワークフローは、

  1. ユーザは、ユーザが認証されていないとして、ユーザが認証されないように、unauthenticatedテンプレートは、
  2. IndexRouteが入力されてレンダリングされ、入力され/ApplicationRoute
  3. にナビゲートリダイレクトがsignIn
  4. signInテンプレートが親テンプレートにレンダリングさに作られて - >unauthenticatedテンプレート
  5. U >unauthenticatedテンプレート

質問私の実装で間違って何

  • - SER記号が正常で、route.transitionTo('dashboard')dashboardテンプレートが親テンプレートにレンダリングされる
  • 呼ばれているのですか?
  • dashboardテンプレートがレンダリングされたときに、renderTemplate関数が呼び出されないのはなぜですか?
  • アプリケーションにテンプレートの再レンダリングを強制するにはどうすればよいですか?

編集2013年1月7日

私はエヴァンの答えに応じて私のコードを変更しました。

私のアプリケーションテンプレートは次のようになります。彼は認証されていないとして、ユーザは、アプリケーション・ページに着地すると

{{#if isAuthenticated}} 
    <h1>Authenticated</h1> 
    {{outlet}} 
{{else}} 
    <h1>Unauthenticated</h1> 
    {{outlet}} 
{{/if}} 

、それがレンダリングされ、認証されていないブロックです。 {{outlet}}タグには何も表示されない点を除き、すべて正常に動作しています...

しかし、私のアプリケーションテンプレートは、この(=条件タグなし)のようになります。

<h1>Unauthenticated</h1> 
{{outlet}} 

...それは働きます!ですから、{{outlet}}タグを条件タグの間に挿入できるかどうか疑問です。

+2

を:;) –

答えて

2

私はこれがルータにこのロジックを持っている間違いかもしれないと思います。代わりにこれはApplicationControllerの一部でなければなりません。

燃えさしが自動的に認証状態に

App.ApplicationController = Ember.Controller.extend({ 
    isAuthenticated: null 
}); 

を追跡ApplicationControllerにを作成し、このようなあなたのテンプレートを構築することができ、アプリケーションの状態の変化に応じてテンプレートを更新しますので:

<script type="text/x-handlebars" data-template-name="application"> 
    {{ #if isAuthenticated }} 
     You are now logged in 
    {{ else }} 
     Please Log In 
    {{ /if }} 
</script> 

今、あなたは「ドンテンプレートを手動で更新/レンダリングすることを実際に心配する必要があります。内部(JS)状態が変更されると、テンプレートはアプリケーションの状態を反映して自動的に更新されます。

+0

https://github.com/emberjs/ember.js/pull/1671、私はこれがマージされます、あなたのために願っていますご回答有難うございます。私は質問を編集してより多くの情報を追加しました。 – Victor

+0

これは良い方法ですので、あなたの答えを受け入れました;) – Victor

2

sly7_7 commentです。アウトレット内部のブロックについては、github.com/emberjs/ember.js/pull/1671を参照してください。

これはちょうどマスターにマージされました:ブロック内のコンセントのhttps://github.com/emberjs/ember.js/pull/1671#issuecomment-11982451

+0

これはあなたの質問に最新のマスターで動作することを確認できますか?私はこれが正しい、私はあなたがあなたの答え、またはエヴァンのものを受け入れることができると思います –

+0

ニース!私は午前中にそれを確認してお知らせします。 – Victor

+0

それは動作します!ありがとう;) – Victor

関連する問題