2

私はEmberを学ぼうとしてきましたが、SOFの他の例に従って、非常に単純なルーティングの例を作成しました。私には3つの見方があります:

ホーム火星木星

言及されたビューを呼び出す/解決する3つのナビゲーションリンクが必要です。私は何が間違っているのかわかりません。まったく出力が得られないようです。誰かが欠点を指摘できれば幸いです。

これがフィドルです:http: //jsfiddle.net/combustion007/PvCk8/

アプリコード:

$(function()
{
    App = Em.Application.create({
        name: "superman",
        init: function(){
            alert("APP INIT");
        }
    })

    //  APPL
    App.ApplicationController = Em.Controller.extend();
    App.ApplicationView = Em.View.extend({
        templateName: 'application'
    });

    //  NAVBAR
    App.NavbarController = Em.Controller.extend();
    App.NavbarView = Em.View.extende({
        templateName: 'navbar',
        classNames: ['']
    });

    //  HOME
    App.HomeController = Em.Controller.extend();
    App.HomeView = Em.View.extend({
        tempalteName: 'home',
        classNames: ['']
    });

    //  MARS
    App.MarsController = Em.Controller.extend();
    App.MarsView = Em.View.extend({
        templateName: 'mars',
        classNames: ['']
    });

    //  JUPITER
    App.JupiterContoller = Em.Controller.extend();
    App.JupiterView = Em.View.extend({
        templateName: 'jupiter',
        classNames: ['']
    });

    //ROUTER INIT
    App.Router = Em.Router.extend({
        enableLogging: true,
        location: 'hash',

        //  EVENTS
        root: Em.Route.extend({
            gotoHome: Ember.Route.transitionTo('home'),
            gotoMars: Ember.Route.transitionTo('mars'),
            gotoJupiter: Ember.Route.transitionTo('jupiter'),

        // STATES
            home: Em.Route.extend({
                route: '/',
                connectOutlets: function(router, context){
                    router.get('applicationController').connectOutlet('home');
                }
            }),

            mars: Em.Route.extend({
                route: '/',
                connectOutlets: function(router, context){
                    router.get('applicationController').connectOutlet('mars');
                }
            }),

            jupiter: Em.Route.extend({
                route: '/',
                connectOutlets: function(router, context){
                    router.get('applicationController').connectOutlet('jupiter');
                }
            }),         
        })
    });
    App.initialize();
})

HTML:

<script type="text/x-handlebars" data-template-name="application">
    {{view App.NavbarView controllerBinding="controller.controllers.navbarController"}}
    <br /><hr />
    <div class="content">
        {{outlet}}
    </div>
</script>

<script type="text/x-handlebars" data-template-name="navbar">
    <ul>
        <li><a href="#" {{action gotoHome}}>Home</a></li>
        <li><a href="#" {{action gotoMars}}>Mars</a></li>
        <li><a href="#" {{action gotoJupiter}}>Jupiter</a></li>
    </ul>
</script>


<script type="text/x-handlebars" data-template-name="home">
    <h2>Home</h2>
    <hr />
    <br /><br />          
</script>


<script type="text/x-handlebars" data-template-name="mars">
    <h2>Mars</h2>
    <hr />
    <br /><br />          
</script>

<script type="text/x-handlebars" data-template-name="jupiter">
    <h2>Jupiter</h2>
    <hr />
    <br /><br />          
</script>
4

2 に答える 2

2

jsfiddleへの変更http://jsfiddle.net/cteegarden/PvCk8/7/

  • ハンドルバーのjsライブラリを追加しました
  • 2つのタイプミスを修正:とにextende変更extendtempaltNametemplateName
  • marsおよびルートを更新して、jupiterルート以外でアクセスできるようにしました。'/'
  • init上のメソッドを削除しましたApp

ハンドルバーテンプレートのは{{outlet}}applicationアプリケーションが状態のときはデフォルトでホームビュー、アプリケーションがの'/'ときは火星ビュー、アプリケーションがの'/mars'ときは木星ビューで埋められます'/jupiter'。テンプレートにある3つのリンクは、navbarプログラムで状態をそれぞれに変更{{outlet}}し、を正しいビューに置き換えます。

編集

同様のルーティングの例を含む2つのリソース

于 2012-12-17T21:41:48.997 に答える
0

私はあなたのjsFiddleを調べ、それを機能させるためにいくつかのことを修正しました:http: //jsfiddle.net/arasbm/fLBty/3/

あなたが決定する必要があるいくつかのことがあるので、それはまだあなたが望むことをしません。そのコードの主な問題/は、ルーターで3回定義されたことです。一度定義するだけで、そのルート内のすべてのコンセントを接続できます。

root: Em.Route.extend({

    whatever: Em.Route.extend({
        route: '/',
        connectOutlets: function(router, context){
            router.get('applicationController').connectOutlet('home_outlet', 'home');
            router.get('applicationController').connectOutlet('mars_outlet', 'mars');
            router.get('applicationController').connectOutlet('jupiter_outlet', 'jupiter');
        }
    })            
})

この場合、同じルート内で複数のアウトレットが使用されているため、アウトレットに名前を付ける必要があります。

<script type="text/x-handlebars" data-template-name="application">
    {{view App.NavbarView}}
    <br /><hr />
    {{outlet home_outlet}}
    {{outlet mars_outlet}}
    {{outlet jupiter_outlet}}
</script>

残り火は数ヶ月しか使っていないので、まだよくわかりません。これがあなたが前進するのに少し役立つことを願っています。

編集:まだリリースされていない新しいルーターAPIに関するコメントに基づいて回答を更新しました。

emberを使い始めたばかりの場合は、tomdaleによるルーターAPI v2ガイドを参照してください。これは、Ember1.0でルーターがどのように定義されるかについての最新情報です。しかし、コメントで指摘されたように、それはまだマスターにはありません。

于 2012-12-16T09:34:03.983 に答える