双方向のデータ バインディングを実現するために、非入力型要素に ng-model を追加する必要がある場合があります。これにより、冗長なコードが削減されます。その場合は、この方法を試すことができます
例: ページで contenteditable 属性を使用して、ユーザーが直接コンパイルできる div 要素を実装します
html:
<style> .text{ margin:0 auto; width:100px; height:50px; border:1px solid red; } </style> </head> <body> <div ng-controller="selectController"> <div ng-repeat="pop in citylist"> <div class="text" contenteditable="true" ng-model="pop.pop"></div> </div> <button ng-click="cs()">输出新数据</button> </div> </body>
ただし、ng-model を直接バインドすると、データを取得できなくなります。この場合、以下に示すように、それにカスタム属性を追加する必要があります。
js:
<script> var app = angular.module('app', []); app.controller('selectController', function ($scope) { $scope.citylist=[{id:1,pop:"北京"},{id:1,pop:"上海"},{id:1,pop:"广州"}]; $scope.p={}; $scope.cs=function(){ console.log($scope.citylist); } }).directive('contenteditable', function() {//自定义ngModel的属性可以用在div等其他元素中 return { restrict: 'A', // 作为属性使用 require: '?ngModel', // 此指令所代替的函数 link: function(scope, element, attrs, ngModel) { if (!ngModel) { return; } // do nothing if no ng-model // Specify how UI should be updated ngModel.$render = function() { element.html(ngModel.$viewValue || ''); }; // Listen for change events to enable binding element.on('blur keyup change', function() { scope.$apply(readViewText); }); // No need to initialize, AngularJS will initialize the text based on ng-model attribute // Write data to the model function readViewText() { var html = element.html(); // When we clear the content editable the browser leaves a <br> behind // If strip-br attribute is provided then we strip this out if (attrs.stripBr && html === '<br>') { html = ''; } ngModel.$setViewValue(html); } } }; }) </script>
パラメータのカテゴリは次のとおりです:
いくつかのパラメータの説明
制限:
(文字列) DOM で命令がどのように宣言されるかを示すオプションのパラメーター。
値は次のとおりです: E (要素)、A (属性)、C (クラス)、M (コメント)。デフォルト値は A です。E (要素): <ディレクティブ名>ディレクティブ名>
A (属性):C (クラス):
文字列は別のコマンドの名前を表し、リンク関数の 4 番目のパラメーターとして使用されます
具体的な使用法を説明するために例を示します
今、2 つの命令を書きたいとします。2 つの命令のリンク関数には重複するメソッドが多数あります (リンク関数については後で説明します)。
現時点では、これらの繰り返しメソッドを 3 番目の命令のコントローラーに記述することができます (前述したように、コントローラーは命令間の再利用動作を提供するためによく使用されます)
次に、これら 2 つの命令のうち、コントローラー フィールドを含む命令 (3 番目の命令)、
を要求します。最後に、これらの重複するメソッドは、リンク関数の 4 番目のパラメーターを通じて参照できます。
<!doctype html> <html ng-app="myApp"> <head> <script src="http://cdn.staticfile.org/angular.js/1.2.10/angular.min.js"></script> </head> <body> <outer-directive> <inner-directive></inner-directive> <inner-directive2></inner-directive2> </outer-directive> <script> var app = angular.module('myApp', []); app.directive('outerDirective', function() { return { scope: {}, restrict: 'AE', controller: function($scope) { this.say = function(someDirective) { console.log('Got:' + someDirective.message); }; } }; }); app.directive('innerDirective', function() { return { scope: {}, restrict: 'AE', require: '^outerDirective', link: function(scope, elem, attrs, controllerInstance) { scope.message = "Hi,leifeng"; controllerInstance.say(scope); } }; }); app.directive('innerDirective2', function() { return { scope: {}, restrict: 'AE', require: '^outerDirective', link: function(scope, elem, attrs, controllerInstance) { scope.message = "Hi,shushu"; controllerInstance.say(scope); } }; }); </script> </body> </html>
では、命令内のコントローラーが異なる命令間の通信に使用されることもさらに説明されています。
さらに、require パラメーター値に次のプレフィックスのいずれかを追加できます。これにより、検索コントローラーの動作が変更されます。
(1) プレフィックスがない場合、命令はそれ自身が提供するコントローラー内を検索し、コントローラーが見つからない場合はエラーがスローされます。
(2)?現在の命令で必要なコントローラーが見つからない場合、リンク接続関数の 4 番目のパラメーターに null が渡されます。
(3)^現在のディレクティブに必要なコントローラーが見つからない場合は、親要素のコントローラーが検索されます(4)?^ 組み合わせ