2

我正在通过使用 appendTo 方法和{{render}}助手在嵌套视图场景中尝试一个简单的事件处理机制,并且在加载时抛出“无法调用 null 的方法查找”错误

相同的 JSFiddle -简单的嵌套视图事件处理

{{render 'parent'}}再观察一下,如果我在应用程序模板中编写并从 java 脚本中删除父级的创建,这一切都很好,有什么想法吗?

4

1 回答 1

4

怎么修:

您的视图或模板似乎没有任何问题。如果您使用 Ember 路由器来管理您的视图,而不是通过 appendTo 手动创建它们,它们将起作用。所以而不是:

var view = App.ParentView.create({ controller: App.ParentController.create() });
view.appendTo('#dvViewRender'); 

使用路由器:

App.Router.map(function() {
  this.route("parent", { path: "/" });
});

并定义一个应用程序模板:

<script type="text/x-handlebars">{{outlet}}</script>

证明给我看!

在这里工作小提琴:http: //jsfiddle.net/mgrassotti/vQpe6/1/

为什么这行得通?

render帮助器被设计为在 Ember.Router 托管视图的上下文中使用。当您调用{{render "child"}}ember 时,会尝试为子模板找到合适的控制器类。

如果我真的想使用 appendTo 方法怎么办?

好的,但不能使用render助手。其他选项:

  • {{partial 'child'}}将插入子模板但不会将其连接到 ChildView 或 ChildController

  • 使用视图助手,它将插入 App.ChildView 并在 ParentController 的上下文中呈现它的模板

  • 使用插座,然后使用 App.ChildController 的实例手动将其连接到 App.ChildView

*更新(基于评论)*

由于这种动态和独立的性质,我无法将整个页面布局和小部件嵌入到一个应用程序模板中。那么对于在这种情况下使用 Ember 有什么建议吗?

每个小部件都可以是一个单独的 ember 应用程序。每个仍然有一个路由器来管理它的状态,但是通过设置history: none该路由器将不会连接到浏览器的 url。例如:

var Widget2App = Ember.Application.create({
  rootElement: '#widget2',
  history: 'none',
  ApplicationView: Ember.View.extend({
    templateName: 'widget2',
  }),
  ParentView: Ember.View.extend({
    templateName: 'parent2',

更新的示例在一页中显示 2 个 ember 应用程序:http: //jsfiddle.net/mgrassotti/L6aVB/

于 2013-01-22T05:15:50.993 回答