web-dev-qa-db-ja.com

現在のスコープをAngularJSサービスに渡す

「現在の」$scopeをAngularJSサービスに渡すのは正しいですか?

私は1つのコントローラーだけで消費されていることを知っている$ serviceがあり、$ serviceメソッド自体でコントローラーのスコープへの参照を持ちたいと思っています。

これは哲学的に正しいですか?

または、$ rootScopeにイベントをブロードキャストしてから、コントローラーにそれらをリッスンさせた方が良いでしょうか?

106
S.C.

非同期が発生したことをコントローラーに知らせるには、 Angular promises を使用します。

$applyを呼び出すには、スコープは必要ありません。特定のスコープまたはルートで呼び出すのに違いがないため、$rootScope.$applyを呼び出すことができます。

変数の読み取りに関しては、パラメータを受け取った方が良いでしょう。しかし、スコープからオブジェクトパラメーターとして読み取ることもできますが、パラメーターを使用すると、サービスインターフェイスがより明確になります。

67
Caio Cunha

あなたの機能がサービスを必要としないよりも1つのコントローラーのみに固有であるなら、私は言うでしょう。

コントローラーのタスクは特定のモデルを操作することですが、サービスはグローバルタスクを処理する必要があります。物事を混同するのではなく、このパラダイムに固執します。

これはドキュメントが言うことです

サービス

角度サービスは、Webアプリに共通の特定のタスクを実行するシングルトンです

コントローラー

Angularでは、コントローラーはangular Scopeのインスタンスを補強するために使用されるJavaScript関数(タイプ/クラス)であり、ルートスコープを除きます。

PS:それとは別に、ダイジェストが必要な場合は、サービス内に$ rootScopeを挿入することもできます。

15
F Lekschas

はい。初期化するときに$ scopeをサービスに渡すことができます。サービスコンストラクターで、スコープをthis._scopeのようなものに割り当て、サービス内でスコープを参照できます!

angular.module('blah').controller('BlahCtrl', function($scope, BlahService) {

    $scope.someVar = 4;

    $scope.blahService = new blahService($scope);

});

angular.module('blah').factory('blahService', function() {

    //constructor
    function blahService(scope) {
        this._scope = scope;

        this._someFunction()
    }

    //wherever you'd reference the scope
    blahService.prototype._someFunction = function() {

        this._scope['someVar'] = 5;

    }

    return blahService;

});
9
user12121234

私は個人的に$scopeをサービスに渡すことは悪い考えだと信じています、それはちょっとした循環参照を作成するからです:コントローラはサービスに依存しますまた、サービスはコントローラーのスコープに依存します。

関係の面で混乱を招くことに加えて、このようなものはガベージコレクターの邪魔になります。

私の推奨するアプローチは、コントローラースコープに ドメインオブジェクト を配置し、それをサービスに渡すことです。このようにして、サービスがコントローラー内で使用されているか、将来別のサービス内で使用されるかに関係なく、サービスは機能します。

たとえば、サービスが配列errorsから要素をプッシュおよびポップする場合、私のコードは次のようになります。

var errors = [];
$scope.errors = errors;
$scope.myService = new MyService(errors);

サービスは、errorsを操作してコントローラーと対話します。もちろん、配列参照全体を完全に消去しないように注意する必要がありますが、結局のところ、それは一般的なJSの関心事です。

放送、$apply、および/または同様のものを使用したくありません。なぜなら、私見の良いOOプラクティスは、Angular-magicsに勝るものだからです。

6