양방향 데이터 바인딩을 구현하기 위해 비입력 유형 요소에 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(속성):
2.요구
문자열은 링크 함수의 네 번째 매개변수로 사용될 다른 명령의 이름을 나타냅니다
구체적인 사용법을 설명하기 위해 예를 들 수 있습니다
이제 두 명령어의 링크 기능에 중복되는 방법이 많다고 가정해 보겠습니다. (링크 기능에 대해서는 나중에 설명하겠습니다.)
이때 세 번째 명령어의 컨트롤러에서 이러한 반복 메서드를 작성할 수 있습니다(위에서 언급했듯이 컨트롤러는 명령어 간 재사용 동작을 제공하는 데 자주 사용됩니다).
그런 다음 이 두 명령어에서 컨트롤러 필드가 포함된 명령어(세 번째 명령어)를 요구합니다.
마지막으로 이러한 중첩 메소드는 link 함수의 네 번째 매개변수를 통해 참조될 수 있습니다.
<!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>
위 예제의 innerDirective 및 innerDirective2 명령어는 externalDirective 명령어의 컨트롤러에 정의된 메서드를 재사용합니다
은 또한 명령어의 컨트롤러가 서로 다른 명령어 간의 통신에 사용된다는 점을 추가로 설명합니다.
또한 필수 매개변수 값에 다음 접두사 중 하나를 추가하면 검색 컨트롤러의 동작이 변경됩니다.
(1) 접두사가 없으면 명령은 자체적으로 제공되는 컨트롤러에서 검색합니다. 컨트롤러가 없으면 오류가 발생합니다
(2)? 현재 명령어에서 필요한 컨트롤러를 찾을 수 없으면 링크 연결 함수의 네 번째 매개변수에 null이 전달됩니다.
(3)^필요한 컨트롤러가 현재 지시어에 없으면 상위 요소의 컨트롤러가 검색됩니다.
(4)?^조합