2016-04-25 5 views
0

私は最近、AngularJSで作業を始めました。基本的なことが分かりましたが、私が見てきた例では、2つの異なるアプローチを見つけました。

プライベート変数や関数を作る:

function myController(){ 
    var controller = this; 
    controller.myVar = 0; 
    controller.myFunction = function(){...}; 
} 

と$スコープを介してそれらを公表する:

function myController(){ 
    $scope.myVar = myVar; 
    $scope.myFunction = function(){...} 
} 

私はプライベートなものを作る必要性を理解することができますが、変数と関数を公開しますそれらの事例ではSingle Responsability Principleが壊れているように感じるので、公衆が私に加わるわけではありません。

パブリックなものを公開する理由はありますか?何かを公開する代替手段はありますか?または私はあまりにも心配ですか?

+0

2ウェイデータバインディングを使用する場合は、 '$ scope'を使用します。 DOMを明示的に読み込み/更新したくない場合です。 – Tushar

+0

ここで見つけた情報の中で最良の情報http://stackoverflow.com/questions/11605917/this-vs-scope-in​​-angularjs-controllers –

答えて

1

$scopeはAngularで古いことです。新しい方法はcontrollerAs構文を使用することです。これはthisの値を変数にバインドするときです。

両方とも動作しますが、新しくcontrollerAsの方法は、いくつかの理由から導入されました。これは、角度2の方法を期待していたものに近いためです。さらに、コントローラは物事を行う方法として、人々がビュー内でネストされたコードスコープを持ち、補間された値がどこから来ているかをよりよく理解することができます。たとえば、次の範囲は角度に継承さ

<div ng-controller="controller1"> 
    {{someVal}} 
    <div ng-controller="controller2">{{anotherVal}}</div> 
</div> 

ので、anotherValの値がcontroller1又はcontroller2から来ているかどうかを言うことは困難です。 controllerAs構文を使用している場合、それはこのような何かをすることが可能であることによりビットをそのをクリア:

<div ng-controller="controller1 as ctrl1"> 
    {{ctrl1.someVal}} 
    <div ng-controller="controller2 as ctrl2"> 
     {{ctrl2.anotherVal}} 
    </div> 
</div> 

を今、これらの値はどこから来ていることが明らかになりました。

しかし、それでもなど、$scope.apply、あなたがそのような$scope.$watchなどの特定の角度のライフサイクルフックにアクセスすることをご希望の場合は$scopeオブジェクトを使用する必要があります、直接

をあなたの質問に答えるために私が主な理由を信じて物事を公開するにはをテストの目的のために使用し、特定のデータ変更についてAngularに "知らせる"ようにして、 "リスニング"ビューを反応させ、そのような変更を更新できるようにします。

+0

要素を公開したくない場合は、このアプローチの代替案?また、これを「古い方法」と言いますと、私にはちょっとバグがあります。それを呼び出すには適切な方法がありますか? –

+0

何かを公開したくない場合は、単に '$ scope'または' this'に添付して、通常のjavascriptスコープ規則に従ってください。 これ以外にも、ディレクティブ分離スコープを作成することで、アプリケーション内で「誰が何を取得するのか」をより細かく調整できます。 編集:私が "古い方法"としてそれを参照しないことに最も近いことは、 "注入されたスコープオブジェクトに直接バインドされている"と言うことです。一種の口がいっぱい。 https://docs.angularjs.org/guide/directive – Pytth

+0

コントローラ間に何かを作る必要があるが、$ scopeを公開したくない場合は、私のコメントを正しく解釈しなかったそれは、どのような選択肢がありますか? –

0

$scopeは、データバインディングを行うとき、またはコントローラ間でデータを渡したいときにのみ使用します。そうでないと、その必要はありません。