1

我正在创建一个 Ember 应用程序作为从服务器返回的一些 HTML 的附加组件。我需要这个 HTML 以便该站点可以被搜索引擎索引,并且还可以加快用户的初始页面呈现。

所以我的应用程序由几个 Ember 视图组成,附加到服务器生成的 HTML 的不同 DOM 元素上。我不使用路由的主模板,所以我将每条路由的 renderTemplate 函数设置为什么都不做。

我的 Ember 应用程序绑定到 body 元素,我可以成功地将自定义视图附加到树下的元素。有用:

在这个 JSFiddle 中,列表的最后三个元素由 Ember 附加

但是当我尝试在我的模板中使用 linkTo 助手时,我遇到了一个错误:

Uncaught TypeError: Cannot read property 'container' of null ember-latest.js:32224

在这个函数中:

router: Ember.computed(function() {
     return get(this, 'controller').container.lookup('router:main');
}),

在这个 JS 小提琴中,我只是将 linkTo 添加到模板中,它破坏了一切

  1. 一般来说,Ember 可以以这种方式工作 - 让许多视图分散在服务器呈现的 HTML 上吗?
  2. 如何修复示例代码?
4

2 回答 2

2

我已经在这里修好了你的小提琴,检查一下。

看起来你是 Ember 的初学者,
所以这里有一些提示,

  1. 您应该有一个application模板,它将是根模板,所有模板都将在该模板上呈现。
  2. 您不应该访问viewsusing this.container.lookup,这仅用于调试。
  3. 您不应该附加views到 DOM,这是框架的工作。
  4. 默认情况下,您的应用程序将附加到 html 的正文中,如果您希望将其附加到其他地方,请rootElement在创建application. 请参阅此处以配置您的application.

    rootElement 可以是 DOM 元素或 jQuery 兼容的选择器字符串。请注意,附加到根元素之外的 DOM 的视图将不会接收事件。如果您指定自定义根元素,请确保仅在其中附加视图!

  5. 不要全局访问任何控制器,例如App.itemsController.set("content", model),如果要访问controller路由中的另一个,请使用this.controllerFor,而要访问另一个controller,请使用needs
  6. 您不需要创建任何控制器实例,例如App.itemsController=Ember.ArrayController.extend({}).create();
    框架处理所有这些。

于 2013-09-09T16:45:56.237 回答
0

I found that I need to additionally bind the view and the container together to make this fiddle work

  App.itemsView.set("controller", App.itemsController);
  App.itemsController.set("container", this.container);

So the resulting working code snippet is here: http://jsfiddle.net/ddegtyarev/6cBRx/6/

Again, let me reiterate that I'm building an hybrid Ember application - i.e. I have some HTML returned right from the server, and some appended by multiple Ember views in multiple places. This is why I have to manually create the views and bind them with controllers etc.

于 2013-09-13T18:24:10.087 回答