1

我们正在构建一个 Ember 应用程序并使用大量嵌套视图,到目前为止,除了一个问题外,一切都在解决。当我们尝试在其中一个嵌套视图中执行操作时,事情就会出错。

有问题的观点是:

App.TodoView = Ember.View.extend({
  templateName: 'app/templates/todo' 
});

App.Todo_entriesView = Ember.View.extend({
  templateName: 'app/templates/todo_entries'
});

App.Todo_entryView = Ember.View.extend({
  templateName: 'app/templates/todo_entry',
});

模板是:

/templates/todo.hbs

<article>
  <h1>{{title}}</h1>  
  {{outlet}}
</article>

/templates/todo_entries.hbs

{{#if isLoading}}
  <p>Loading...</p>
{{else}}
  <ul class="list">
    {{collection contentBinding="content" itemViewClass="App.Todo_entryView"}}
  </ul>
{{/if}}

/templates/todo_entry.hbs

<li>
{{#if isLoading}}
  Loading...
{{else}}
  {{view.content.id}}) {{view.content.title}}
  <a {{action deleteRecord href="true" target="controller"}}>Delete</a>
{{/if}}
</li>

控制器是:

App.TodoController = Ember.ObjectController.extend({
  deleteRecord: function() {
    this.get('content').deleteRecord();
    this.transaction.commit();
    App.router.transitionTo('todo');
  }
});

App.Todo_entriesController = Ember.ArrayController.extend();

App.Todo_entryController = Ember.ObjectController.extend({
  deleteRecord: function() {
    this.get('content').deleteRecord();
    this.transaction.commit();
    App.router.transitionTo('todo');
  }
});

当单击删除按钮时,我们得到一个错误,即 deleteRecord 方法不存在于 Todo_entriesController(即视图的父级)上,而不是我们期望的 Todo_entryController 上。

有谁知道我们如何在 Todo_entry 模板中获取 deleteRecord 操作以正确调用 Todo_entryController deleteRecord 方法?还是有更好的方法来完全做到这一点?

谢谢,丹

4

1 回答 1

1

由于 App.Todo_entryView 是在不使用 connectOutlet 的情况下创建的,因此它不会自动绑定到 App.Todo_entryController,而是使用其 parentView 控制器。

也许解决方法可能是覆盖 App.Todo_entryView 的 init 方法并手动实例化控制器。就像是:

App.Todo_entryView = Ember.View.extend({
  templateName: 'app/templates/todo_entry',
  init: function(){
    this._super();
    this.set(
      'controller',
      App.Todo_entryController.create({ content: this.get('content') })
    );
  }
});
于 2012-10-23T16:28:33.683 回答