AngularJSは、グローバルスコープスコープアイソレートと通信します

プロジェクトの開発時には、グローバルスコープとローカルスコープディレクティブは明確なスコープ、グローバルスコープとローカルスコープディレクティブ通信マスタは、グローバルスコープとディレクティブのローカルスコープの使用の要約を行うためにここに、十分に徹底的ではありません。

 

、スコープスコープ

1、AngularJS、通常のJavaScriptプロトタイプ継承によって継承された親スコープのサブスコープのプロパティとメソッド。ディレクティブ内のスコープを使用します:一つの例外があります{...}は、このアプローチの適用範囲は、独立した「アイソ」スコープを作成することです、それは親を持つスコープはなく、その親スコープのプロトタイプチェーン、私たちは、親スコープのプロトタイプを継承しません。一般に構成されたスコープディレクティブ再利用可能なアセンブリを定義し、このように使用されます。

2我々は、サブスコープのプロパティで定義された親スコープを訪問する場合は、JavaScriptが最初の子スコープでプロパティを探し、そして再びますが見つからない場合は、親から探しすることは、プロトタイプチェーンの範囲を見つけることができませんでした父アップのスコープのプロトタイプチェーンを検索します。AngularJSでは、プロトタイプチェーンのスコープの先端には、JavaScriptが$ rootScopeまで求めて、$ rootScopeです。

図3に示すように、スコープ:{...} - 別個の「分離」スコープ、プロトタイプの継承を作成するディレクティブ。これは、再利用可能なコンポーネントのディレクティブを作成するための最良の選択です。それは直接アクセスしないので、/、予期しない副作用を親スコープのプロパティを変更しません。

 

二、スコープの引用修飾子を分離

1、=または= attrの親スコープスコープの属性は、最も一般的な方法である相手に、影響を与える変更を双方向結合属性「隔離」。

2、@または「分離」属性と親属性スコープの範囲は方法の結合、すなわち、スコープ親スコープのみ値を読み取る「分離」@attr、及び永久String型の値。

3、&または&attrの「アイソ」のスコープ機能にパッケージ化親スコープ属性、解析パッケージは$で、関数の親スコープのプロパティを読み書きするように

 

コントローラと三、指令データ転送および通信

子スコープに1、親コントローラモニタグローバルスコープ(親スコープ)変数、およびブロードキャストイベント(ディレクティブのスコープは、それぞれが独自の独立したスコープdirectvieスコープを持っています)

図2に示すように、指令は= @、&(方法)文字表示基準グローバルスコープによって、ローカルスコープを定義します

図3に示すように、指令範囲(サブスコープ)参照親によってグローバルスコープの特性[$スコープ。$ Parent.xxx]

4、ディレクティブモニターグローバルスコープ変数は$スコープ。$親によって、変化する。$ウォッチ方法を

第四に、例えば、ショー

<div ng-controller="MyCtrl">
   <button ng-click="show=true">show</button>
   <dialog title="Hello }"
           visible="}"
           on-cancel="show=false;"
           on-ok="show=false;parentScope();">
       <!--上面的on-cancel、on-ok,是在directive的isoloate scope中通过&引用的。
       如果表达式中包含函数,那么需要将函数绑定在parent scope(当前是MyCtrl的scope)中-->
       Body goes here: username:} , title:}.
       <ul>
           <!--这里还可以这么玩~names是parent scope的-->
           <li ng-repeat="name in names">}</li>
       </ul>
       <div>
           Email:<input type="text" ng-model="email" style="width: 200px;height:20px"/>
       </div>
       <div>
           Count:<input type="text" ng-model="person.Count" style="width: 120px;height:20px"/>
           <button ng-click="changeCount()">Count加1</button>
       </div>
       <p></p>
   </dialog>
</div>

  C テストコードontroller。

var app = angular.module("Dialog", []);
   app.controller("MyCtrl", function ($scope) {
       $scope.person = {
           Count: 0
       };
       $scope.email = '[email protected]';
       $scope.names = ["name1", "name2", "name3"];
       $scope.show = false;
       $scope.username = "carl";
       $scope.title = "parent title";
       $scope.parentScope = function () {
           alert("scope里面通过&定义的东东,是在父scope中定义");
       };
 
 
       $scope.changeCount = function () {
           $scope.person.Count = $scope.person.Count + 1;
       }
 
 
       // 监听controller count变更, 并发出事件广播,再directive 中 监听count CountStatusChange变更事件
       $scope.$watch('person.Count', function (newVal, oldVal) {
           console.log('>>>parent Count change:' + $scope.person.Count);
           if (newVal != oldVal) {
               console.log('>>>parent $broadcast count change');
               $scope.$broadcast('CountStatusChange', {"val": newVal})
           }
       });
 
 
   });
 
 
   app.directive('dialog', function factory() {
       return {
           priority: 100,
           template: ['<div ng-show="visible">',
               '    <h3>}</h3>',
               '    <div class="body" ng-transclude></div>',
               '    <div class="footer">',
               '        <button ng-click="onOk()">OK</button>',
               '        <button ng-click="onCancel()">Close</button>',
               '    </div>',
               '</div>'].join(""),
           replace: false,
           transclude: true,
           restrict: 'E',
           scope: {
               title: "@",//引用dialog标签title属性的值
               visible: "@",//引用dialog标签visible属性的值
               onOk: "&",//以wrapper function形式引用dialog标签的on-ok属性的内容
               onCancel: "&"//以wrapper function形式引用dialog标签的on-cancel属性的内容
           },
           controller: ['$scope', '$attrs', function ($scope, $attrs) {
 
 
 
 
               // directive scope title 通过@ 引用dialog标签title属性的值,所以这里能取到值
               console.log('>>>title:' + $scope.title);
               >>>title:Hello carl scope.html:85
 
 
               // 通过$parent直接获取父scope变量页可以
               console.log('>>>parent username:' + $scope.$parent.username);
               >>>parent username:carl
 
 
               // directive scope 没有定义username 变量,并且没有引用父scope username变量, 所以这里是undefined
               console.log('>>>child username:' + $scope.username);
               >>>username:undefined
 
 
 
 
               // 接收由父controller广播count变更事件
               $scope.$on('CountStatusChange', function (event, args) {
                   console.log("child scope on(监听) recieve count Change event :" + args.val);
               });
 
 
               // watch 父 controller scope对象
               $scope.$parent.$watch('person.Count', function (newVal, oldVal) {
                   console.log('>>>>>>>child watch parent scope[Count]:' + oldVal + ' newVal:' + newVal);
               });
 
 
           }]
       };
   });

  

ます。https://www.cnblogs.com/hubcarl/p/4202053.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_33795093/article/details/93817355