Javascript 将数据加载到ember路由器的根路由(当它';在应用程序外部创建的。创建()
如果要在路由器中使用在Javascript 将数据加载到ember路由器的根路由(当它';在应用程序外部创建的。创建(),javascript,ember.js,Javascript,Ember.js,如果要在路由器中使用在Em.Application.create()中创建的类,则需要在Application.create外部指定路由器。但由于应用程序是自动初始化的,路由器不会路由到/路由 您过去可以通过向application.create添加autoinit:false来推迟初始化。现在您应该使用App.deferReadiness()和App.advanceReadiness()。然而,这似乎不起作用 我似乎无法逃避这样一种感觉:你“应该”以不同的方式去做 我添加了最少的代码来显示下面
Em.Application.create()
中创建的类,则需要在Application.create外部指定路由器。但由于应用程序是自动初始化的,路由器不会路由到/
路由
您过去可以通过向application.create添加autoinit:false
来推迟初始化。现在您应该使用App.deferReadiness()
和App.advanceReadiness()
。然而,这似乎不起作用
我似乎无法逃避这样一种感觉:你“应该”以不同的方式去做
我添加了最少的代码来显示下面的问题。还有一个jsfiddle
编辑:
显然,在恩伯有一个新的路由器,我有点忽略了这一点。我已经把代码改成了新的路由器,但是猜猜看什么它仍然不工作:P
window.App = App = Em.Application.create({
ApplicationController: Em.Controller.extend({}),
ApplicationView: Em.View.extend({
template: Em.Handlebars.compile('{{outlet}}'),
}),
ExtendedPatientController: Em.ObjectController.extend({}),
ExtendedPatientView: Em.View.extend({
classNames: ['patient-view', 'extended'],
template: Em.Handlebars.compile('{{name}}')
}),
Patient: Em.Object.extend({
name: undefined,
}),
});
App.Router.map(function (match) {
match('/').to('application', function (match) {
match('/').to('extendedPatient');
})
});
App.deferReadiness();
App.ExtendedPatientRoute = Em.Route.extend({
setupController: function (controller) {
controller.set('', App.Patient.create({
name: "Bert"
}));
},
renderTemplates: function () {
this.render('extendedPatient', {
into: 'application'
});
}
});
App.advanceReadiness();
因此,新的路由器确实解决了这个问题,而且确实感觉有点光亮 我终于发现了如何做这个基本的例子这就是路由器中发生的事情:
App.Router.map(function (match) {
match('/').to('extendedPatient');
});
以下是视图中需要执行的操作:
ExtendedPatientView: Em.View.extend({
classNames: ['patient-view', 'extended'],
//You need to specify the defaultTemplate because you extend the view class
//instead on initializing it.
defaultTemplate: Em.Handlebars.compile('{{name}}')
}),
你不必推迟新路由器修复的应用程序中的就绪时间
在路由中,您不需要指定renderTemplates
,因此路由器现在看起来像:
App.ExtendedPatientRoute = Em.Route.extend({
setupController: function (controller) {
controller.set('content', App.Patient.create({
name: "Bert"
}));
},
});
实际上,您在这里做的工作比您需要的要多 下面是使示例正常工作所需的所有代码 模板:
<script type="text/x-handlebars" data-template-name="index">
<div class="patient-view extended">
<p>Name: {{name}}</p>
</div>
</script>
工作小提琴位于:
让我解释一下:
- 当您转到
时,您将进入自动/
路线。要在屏幕上显示该路由的内容,只需实现一个索引
模板。当您开始运行时,最简单的方法是将模板放在索引
中。稍后,您可能需要使用构建工具(有关更多信息,请参阅)index.html
- 通过覆盖路由处理程序中的
挂钩,可以控制在路由模板中显示的模型。对于模型
,路由处理程序是索引
。在这种情况下,模型是全新的App.IndexRoute
App.Patient
您可能需要实现控制器和事件。您可以在上了解有关路由器的更多信息,我想说您通常根本不需要调用延迟/高级。能否尝试在应用程序外部定义视图和控制器。create()?类似于App.ExtendedPatientController=Ember.ObjectController.extend()…好吧,我试试,谢谢:)太棒了,谢谢!何时覆盖
型号
,何时覆盖设置控制器
?不过,做额外的工作是有点故意的。去年我在某个地方开发了一个ember应用程序。我想了解最新版本。您可以覆盖model
以指定您的路线所代表的模型(它将成为控制器的model
属性)。您可以重写setupController
,在控制器上设置希望模板能够访问的其他属性。
window.App = Em.Application.create();
App.Patient = Em.Object.extend({
name: null
});
App.IndexRoute = Em.Route.extend({
model: function() {
return App.Patient.create({
name: "Bert"
});
}
});