1

我目前正在尝试在 ember 中进行路由,并有一个工作示例。问题是,我有点困惑为什么它有效。目前这条路线只有 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 的实例的?

我在“关于”页面视图和控制器之间做了一个简单的测试绑定。在视图中,我正在绑定变量“App.aboutController.numWidgets”。我从未调用过 App.AboutController.create()。那么如何有一个这样的实例可供我交谈呢?同样,它有一个小写字母(“aboutController”)。我所做的只是扩展一个控制器(并用大写字母命名它 - “AboutController”)

稍微解释一下就好了,就像任何普通的开发人员一样,我觉得在你不知道它为什么工作的地方使用代码是疯狂的!

4

1 回答 1

5

App.initialize(); does all the instantiation and injection stuff :), based on strong naming conventions: Ember naming / capitalization convention. When you call xxxController.connectOutlet(options), the option has is also conventional, see Confusion about naming conventions in emberjs

Hope that helps.

EDIT: With the latest master, you don't have to call App.initialize() manually. The application is auto-initialized when all is ready :)

于 2012-08-07T10:04:06.777 回答