谁在为我实例化我的对象?:■

Ric*_*ich 1 ember.js

我正在尝试使用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();
Run Code Online (Sandbox Code Playgroud)

在我的HTML中,我只有几个非常简单的模板,名称为"application","home"和"about".

所以,它一切正常,看起来非常类似于在网上浮动的所有示例.大!但是我很困惑我似乎有多少东西为我实例化,没有我要求这样做.它是否正确?

例如:

它是如何创建ApplicationController的实例的?

在connectOutlets函数中,它正在寻找一个名为"applicationController"的控制器.我从来没有创建任何名为"applicationController"的东西(小写"a"),我只是扩展了一个控制器并将其称为"ApplicationController"(带有大写"A").为什么这样做?

它是如何创建AboutController的实例的?

我在"about"页面视图和控制器之间进行了简单的测试绑定.在视图中,我绑定变量'App.aboutController.numWidgets'.我从未调用过App.AboutController.create().那么如何准备好与我交谈呢?同样,它有一个小写字母("aboutController").我所做的只是扩展一个控制器(用大写字母命名 - "AboutController")

一点点解释会很棒,就像任何普通的开发人员一样,我觉得使用代码而你不知道为什么它的工作是疯了!

sly*_*7_7 5

App.initialize();完成所有实例化和注入的东西:),基于强大的命名约定:Ember命名/大写约定.当您调用xxxController.connectOutlet(options)时,该选项也是常规的,请参阅关于emberjs中命名约定的混淆

希望有所帮助.

编辑:使用最新的master,您不必手动调用App.initialize().一切就绪后,应用程序自动初始化:)