3

サンプルアプリを追加しました。 http://jsfiddle.net/Sly7/amG56/

J:

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>

いずれかの本を選択してください。本の名前が表示されます。ただし、「選択した本をキャンセルする」リンクは機能しません。

問題は、本を選択してもアクション ヘルパーのコンテキストが変わらないことだと思います。

コンテキストが変化するアクション ヘルパーを実装するにはどうすればよいですか? それともバグですか?

4

1 に答える 1

7

答えはガイド http://emberjs.com/guides/templates/actions/#toc_action-parametersにあります

また、コンテキストが遅延評価されるため、問題は発生しなくなります。

以下の非推奨の回答

ここでの問題は、アクションヘルパーがselectedBookコンテキストで解釈されることです。ただし、現時点では、selectedBookはnullです。したがって、リンクをクリックすると、以前に本を選択したとしても、遅すぎます。登録されたアクションに対して、コンテキストはnullのままです。回避策として、これを{{with}}ブロックで囲むことができます。

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

参照: http: //jsfiddle.net/x82dr/17/

ところで、controllerプロパティを使用して、アプリケーションコントローラーにアクセスするApplicationViewのコードを確認できます。Ember.jsの規則では、アプリケーションの初期化時にコントローラーがビューに挿入されます

更新:{{with}}ヘルパーの使用は現在必須ではないようです。https ://github.com/emberjs/ember.js/issues/1150を参照してください。

于 2012-11-17T12:07:18.663 に答える