5

角度コントローラーがリッスンできるイベントをブロードキャストするために、非角度コード (この場合は Facebook および Twitter JS SDK) が必要なシナリオがあります。なんで?最初のページの読み込み後、AJAX を介してページのコンテンツを読み込んで修正します。コンテンツには、複数のいいね/ツイート ボタンが添付されています (ブログ/アグリゲーターのフロント ページのように)。Facebookの「いいね」ボタンまたはTwitterの「共有」ボタンのいずれかでクリックが発生したときにイベントフックを追加したいと思います.ページにはそれらのいくつかがあり、新しいコンテンツが取得されるたびにそれぞれが変更されます(これもajax経由) )。

現在、SDK はこれを別の方法で処理します。

ツイッター

twttr.events.bind('click', function(event){
    // here I'd like to somehow
    // $rootScope.$broadcast("twitter:clicked", event.currentTarget)
});

フェイスブック

FB.Event.subscribe("edge.create", function(resp) {
    // here I'd like to somehow
    // $rootScope.$broadcast("facebook:clicked", resp)
});

いくつかのコントローラー

app.controller("SomeController", ['$scope', function($scope) {
    $scope.$on("facebook:clicked", function(event, resp) {
        // do something with resp
    });

    $scope.$on("twitter:clicked", function(event, target) {
        // do something target
    });
}])

新しいコンテンツがフェッチされるたびにこれらのコントローラーが再作成される場合でも、これらのイベント ハンドラーを一度バインドしてから、関連するコントローラーでブロードキャストされたメッセージを処理するという考え方です。

基本的に、私が探しているのは、アプリの一部ではないにもかかわらず、既存の既に初期化された角度のあるアプリ$rootScopeとメッセージにフックする方法です。$broadcastこれが理にかなっていることを願っています。ありがとう。

4

2 に答える 2

10

Angular コード内で (おそらくリンクを作成するディレクティブで) 他のアプリケーションにバインドできます。このようにして、にアクセスできます$rootScope

または、アプリケーションを手動でブートストラップする場合は、インジェクターへの参照を保持して、以下を取得できます$rootScope

var injector = angular.bootstrap(element, ["myAppModule", ...]);
var $rootScope = injector.get("$rootScope");

$applyいずれにせよ、外部イベントの後に呼び出すことを忘れないでください。

于 2013-10-05T12:56:27.573 に答える