Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将数据加载到ember路由器的根路由(当它';在应用程序外部创建的。创建()_Javascript_Ember.js - Fatal编程技术网

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"
    });
  }
});