3

我添加了示例应用程序。 http://jsfiddle.net/Sly7/amG56/

JS:

App = Ember.Application.create();

App.ApplicationController = Ember.ArrayController.extend({
  selectedBook: null
});

App.ApplicationView = Ember.View.extend({

  actions: {
    selectBook: function(book) {
      this.get('controller').set("selectedBook", book);
    },

    cancel: function(book) {
      alert(book);
    }
  }
});

App.Book = Em.Object.extend({
  name: null
});

模板:

<script type="text/x-handlebars">
  {{#each book in books}}
    <a {{action "selectBook" book target="view"}} href="#">select {{book.name}}</a><br />
  {{/each}}
  <hr />
  Selected Book: {{selectedBook.name}}
  <br />
  <a {{action "cancel" selectedBook target="view"}} href="#">cancel selected book</a>
</script>

​</p>

选择其中一本书。您将看到将显示该书的名称。但是“取消选定的书”链接不起作用。

I think the problem is context of the action helper does not change when a book is selected.

如何实现具有不断变化的上下文的动作助手?或者它是一个错误?

4

1 回答 1

7

答案在指南中 http://emberjs.com/guides/templates/actions/#toc_action-parameters

并且上下文被懒惰地评估,所以问题不再发生

下面不推荐使用的答案

这里的问题是动作助手是用 selectedBook 上下文解释的。但此时 selectedBook 为空。所以当点击链接时,即使你之前选择了一本书,也为时已晚,对于注册的动作,上下文仍然为空。作为一种解决方法,您可以用 {{with}} 块将其括起来。

{{#with selectedBook}} 
  Selected Book: {{name}}
  <br />
  <a {{action cancel this target="view"}} href="#">cancel selected   book</a>
{{/with}}

见:http: //jsfiddle.net/x82dr/17/

顺便说一句,您可以看到 ApplicationView 的代码,我在其中使用控制器属性访问应用程序控制器。使用 Ember.js 约定,控制器在应用程序初始化时被注入到视图中

更新: {{with}} 助手的使用现在似乎不是强制性的,请参阅:https ://github.com/emberjs/ember.js/issues/1150

于 2012-11-17T12:07:18.663 回答