1

現在、残り火でルーティングを実験しており、実際の例があります。問題は、なぜそれが機能するのか少し混乱していることです。現在、このルートには2つの単純なビューがあります。コードは次のとおりです。

App = Em.Application.create();

App.Router = Ember.Router.extend({
  root: Ember.Route.extend({

    index: Ember.Route.extend({
      route: '/',
      redirectsTo: 'home' //when hitting the base URL, redirect to home
    }),
    home: Ember.Route.extend({
      route: '/home', 
      connectOutlets: function(router) {
        router.get('applicationController').connectOutlet('home'); 
      }
    }),
    about: Ember.Route.extend({
      route: '/about',
      connectOutlets: function(router) {
        router.get('applicationController').connectOutlet('about'); 
      }
    })
  })
});


//Main controller + view
App.ApplicationController = Ember.Controller.extend({});

App.ApplicationView = Ember.View.extend({ 
    templateName: 'application',
    goHome: function(){
        App.router.transitionTo('home'); 
    },
    goAbout: function(){
        App.router.transitionTo('about');
    }
});


// Home page
App.HomeView = Ember.View.extend({
    templateName: 'home'
})


// About page
App.AboutController = Ember.Controller.extend({
    numWidgets: 45
})

App.AboutView = Ember.View.extend({
    numWidgetsBinding: 'App.aboutController.numWidgets',
    templateName: 'about'
})


App.initialize();

私のHTMLには、「application」、「home」、「about」という名前の非常に単純なテンプレートがいくつかあります。

したがって、それはすべて機能し、ネット上に浮かんでいるすべての例と非常によく似ています。素晴らしい!しかし、私は、私がそれをするように頼むことなく、私のためにいくつかのことをインスタンス化したように見えることについて混乱しています。これは正しいです?

例えば:

ApplicationControllerのインスタンスをどのように作成していますか?

connectOutlets関数では、「applicationController」と呼ばれるコントローラーを探しています。「applicationController」(小文字の「a」)と呼ばれるものを作成したことはありません。コントローラーを拡張して「ApplicationController」(大文字の「A」)と呼びました。なぜこれが機能するのですか?

AboutControllerのインスタンスをどのように作成していますか?

「about」ページビューとコントローラーの間で簡単なテストバインディングを実行しました。ビューでは、変数「App.aboutController.numWidgets」を使用してバインドしています。App.AboutController.create()を呼び出したことはありません。それで、私が話す準備ができているこのインスタンスはどのようにありますか?ここでも、小文字( "aboutController")があります。私が今までにしたことは、コントローラーを拡張することだけでした(そして大文字で名前を付けました-「AboutController」)

通常の開発者と同じように、少し説明するとよいでしょう。なぜ機能しているのかわからないコードを使用するのはおかしいと思います。

4

1 に答える 1

5

App.initialize();強力な命名規則に基づいて、すべてのインスタンス化とインジェクションを行います:):Emberの命名規則/大文字化の規則。xxxController.connectOutlet(options)を呼び出すと、オプションも従来型になります。emberjsの命名規則に関する混乱を参照してください。

お役に立てば幸いです。

編集:最新のマスターを使用すると、App.initialize()を手動で呼び出す必要はありません。すべての準備が整うと、アプリケーションは自動初期化されます:)

于 2012-08-07T10:04:06.777 に答える