在Ember模板中使用linkTo帮助程序时,无法读取属性“container”为null

r3i60tvu  于 2022-10-20  发布在  其他
关注(0)|答案(2)|浏览(109)

我正在创建一个Ember应用程序,作为从服务器返回的一些HTML的附加组件。我需要这个HTML,这样网站可以被搜索引擎索引,也可以加速用户的初始页面呈现。
因此,我的应用程序由几个Ember视图组成,附加到服务器生成的HTML的不同DOM元素。我不为路线使用主模板,所以我将每条路线的renderTemplate函数设置为什么都不做。
我的Ember应用程序绑定到body元素,我可以成功地将自定义视图附加到树下的元素。它的工作原理:

In this JSFiddle three last elements of the list are appended by 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');
}),

In this JS fiddle I just add linkTo to the template, and it breaks everything

1.通常,Ember可以这样工作吗?在服务器呈现的HTML上分散许多视图?
1.如何修复示例代码?

gfttwv5a

gfttwv5a1#

我把你的小提琴修好了,看看。
看来你是Ember的初学者,
所以这里有一些提示给你,
1.您应该有一个application模板,它将是根模板,所有模板都将在该模板上呈现。
1.您不应该使用this.container.lookup访问views,这仅用于调试。
1.您不应该将views附加到DOM,这是框架的工作。
1.默认情况下,您的应用程序将被附加到html的正文中,如果您希望它被附加到其他地方,请在创建application时提供rootElement属性。有关配置application的信息,请参阅here
rootElement可以是DOM元素或jQuery兼容的选择器字符串。请注意,在根元素之外附加到DOM的视图将不会接收事件。如果您指定了自定义根元素,请确保只在其中添加视图!
1.不要像App.itemsController.set("content", model)那样全局访问任何控制器,如果要访问路由内的另一个controller,请使用this.controllerFor;如果要访问另一个n10o1p内的控制器,请使用m2 11o1p。
1.您无需创建任何类似App.itemsController=Ember.ArrayController.extend({}).create();的控制器示例

框架将处理所有这些问题。

s1ag04yj

s1ag04yj2#

我发现我还需要将视图和容器绑定在一起才能使这个提琴工作

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

因此,得到的工作代码片段如下:http://jsfiddle.net/ddegtyarev/6cBRx/6/
再次,让我重申,我正在构建一个混合的Ember应用程序——也就是说,我有一些HTML从服务器直接返回,还有一些由多个Ember视图在多个位置附加。这就是为什么我必须手动创建视图并将其与控制器等绑定。

相关问题