2

これがフィドルです。

http://jsfiddle.net/inconduit/hf7XM/10/

問題を再現する手順:

  • 「投稿に移動」をクリックします。
  • 「controllerFor」テキストをクリックしても、リストはクリアされません。
  • グローバル参照テキストをクリックすると、リストがクリアされます。

によって返されるコントローラー参照は、controllerFor()実際にはPostsIndexController?ではないようです。何故ですか?

ルートのフックでハッキングして、setupController()アプリのそのコントローラーへのグローバル参照を設定し、その参照のコンテンツを の新しい配列に設定するemptyList2()と、テンプレートでリストが正しくクリアされます。

私はcontrollerFor()間違って使用していますか?またはそれが返すものを誤解していますか?それはスコーピングの問題ですか?私を助けてください。

App.PostsIndexRoute = Ember.Route.extend({
  setupController : function(controller,model) {
    controller.set('content',['one','two','three']);
    App.postsIndexController = controller;
  }
});

// receives the {{action}} from the template
App.PostsController = Ember.Controller.extend({
  emptyList : function() {
    this.controllerFor('postsIndex').set('content',Ember.A());
  },
  emptyList2 : function() {
    App.postsIndexController.set('content',Ember.A());
  }  
});
4

1 に答える 1

6

tldr: に置き換えcontrollerFor('postsIndex')ますcontrollerFor('posts.index')


emptyList2 fx が機能していたのは、App.postsIndexController定数をコントローラ インスタンスが渡されたものに設定したためですsetupController

これを修正する方法よりも、これらの問題をデバッグする方法が重要だと思います。これが私がしたことです:

その JS フィドルの実行中に JS コンソールを開きました。投稿リンクをクリックした後、リストを空にしようとする前に、次を実行しました。

Em.keys(App.__container__.cache.dict)
["application:main", "router:main", "route:application", "route:index", "controller:application", "template:application", "controller:index", "template:index", "route:posts", "route:posts.index", "controller:posts", "template:posts", "controller:posts.index", "template:posts.index"]

次に、 emptyList アクションをクリックした後、再試行しました。

Em.keys(App.__container__.cache.dict)
["application:main", "router:main", "route:application", "route:index", "controller:application", "template:application", "controller:index", "template:index", "route:posts", "route:posts.index", "controller:posts", "template:posts", "controller:posts.index", "template:posts.index", "controller:postsIndex"]

App.PostsIndexController の 2 つのキャッシュされたインスタンスがあることを確認してください: controller:postsIndex と controller:posts.index

次に、いくつかの console.logs を jsFiddle に追加して、どのインスタンスが参照されているかを確認しました。そこから、修正を行うのは非常に簡単でした。Ember はすべてのオブジェクトに toString() メソッドを追加するため、何が起こっているのかを簡単に確認できます。例えば:

controllerFor("postsIndex").toString()
<App.PostsIndexController:ember218>

ここでフィドルを更新しました:http://jsfiddle.net/mgrassotti/Aa2WX/2/

于 2013-01-17T20:23:21.667 に答える