2016-09-22 6 views
1

http://jsfiddle.net/9hazjjcc/コントローラAngularJS

var myApp = angular.module('myApp',[]); 

function MyCtrl($scope, myService) { 
    $scope.targetMode = myService.targetMode; 
    $scope.myService = myService; 
} 

myApp.service('myService', function() { 
    this.targetMode = 2; 
}); 

function ctrlTwo($scope, myService) { 
    $scope.addToTargetMode = function() { 
    myService.targetMode++; 
} 
} 

HTMLにサービス変数をバインド:

<div ng-controller="MyCtrl"> 
    <p>Hello, {{ targetMode }}!</p> 
    <p>Hello, {{ myService.targetMode }}!</p> 
</div> 

<div ng-controller="ctrlTwo"> 
    <button ng-click="addToTargetMode()"> 
    Add To Target Mode 
    </button> 
</div> 

これJSFiddleはそれを最大限に述べています。コントローラでサービス変数を使用してビューを操作したいのですが、サービス全体をコントローラに公開したくないのは、角度のようなものではないからです。それともベストプラクティスと考えられていますか?

理想的には、最初の段落が更新され、サービスからのtargetMode変数が変更されるたびに表示されます。

答えて

0

"ターゲットモード"を管理するサービスが作成されていればあなたの方法は悪いことではありませんが、この方法を使うことができますが、this.targetMode = 2を公開する代わりに、これはサービス機能ですモデルパターンのようなサービスは、あなたのサービスであなたは、このようにいろいろ書い操作を行うことができます。

myApp.service('myService', function() { 
    var targetMode = 2; 

    return { 
     getTargetMode: function() { return targetMode; } 
}); 
あなたはプライベート関数、あなたのサービスに混ぜるだけなどなど

を、公共公開する。しかし、私の意見では、原因ができ

あなたが知っているように、サービスはスコープに注入されない、彼らはPAとしてではない、コントローラ変数(スコープ変数私は意味する)である方が良いと思うあなたは角型のバインディングが必要だと思うので、スコープ変数を使用し、コントローラで宣言してください(カスタムディレクティブはそれぞれの場合に依存します)。これは角度のある方法です。 サービス(非スコープvar)を使用している場合は、コントローラで手動で見ることができます。または、関数をウォッチャとして使用できますが、スコープ変数を使用する方が効率的です。

$ scope.addToTargetModeは、あなたがサービスに行く必要があるため、$ scope.addToTargetModeは関数として宣言されています。ダイジェストサイクルではそれほどですコントローラーの値を直接使用すると効率的です。すべてのダイジェストサイクルであなたの機能が実行されることを説明しましょう。したがって、スコープ変数(サービスを忘れる)を直接使用すると、スコープに「自分自身で素晴らしい管理」があるため、ダイジェストサイクルは追加呼び出しではありません。 スコープの変数を角型で見る:オブジェクト、文字列、数値、配列は変化し、何もしないと "変更"しますが、スコープの関数変数を使うと角度のマジックが最悪になります。ダイジェストサイクルでこの関数が計算されます。

したがって、常にバインディングに変数を使用し、コントローラーで考えると、サービスはbbddなどからデータを取得する必要がある場合などに適しています。確かに、これはAngular 1.X.Xを使用している場合のみ適用され、Angular 2はその他の履歴です

関連する問題