我目前正在尝试在 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”)
稍微解释一下就好了,就像任何普通的开发人员一样,我觉得在你不知道它为什么工作的地方使用代码是疯狂的!