Manchmal müssen wir ng-model zu Nicht-Eingabetypelementen hinzufügen, um eine bidirektionale Datenbindung zu erreichen und dadurch redundanten Code zu reduzieren. Dann können Sie diese Methode ausprobieren
Zum Beispiel: Ich verwende das contenteditable-Attribut auf meiner Seite, um div-Elemente zu implementieren, die von Benutzern direkt kompiliert werden können
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>
Wenn Sie ng-model jedoch direkt binden, erhalten Sie die Daten definitiv nicht. In diesem Fall müssen Sie benutzerdefinierte Attribute hinzufügen, wie unten gezeigt.
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>
Die Parameterkategorien sind wie folgt:
Erklärung einiger Parameter
einschränken:
(String) optionaler Parameter, der angibt, wie die Anweisung im DOM deklariert wird;
Die Werte sind: E (Element), A (Attribut), C (Klasse), M (Kommentar), wobei der Standardwert A ist;E (Element):
C (Klasse):
Die Zeichenfolge stellt den Namen eines anderen Befehls dar, der als vierter Parameter der Link-Funktion verwendet wird
Wir können ein Beispiel geben, um die spezifische Verwendung zu veranschaulichen
Angenommen, wir möchten jetzt zwei Anweisungen schreiben. Es gibt viele überlappende Methoden in der Verknüpfungsfunktion der beiden Anweisungen (die Verknüpfungsfunktion wird später erläutert),
Zu diesem Zeitpunkt können wir diese wiederholten Methoden in den Controller der dritten Anweisung schreiben (wie oben erwähnt, wird der Controller häufig verwendet, um Wiederverwendungsverhalten zwischen Anweisungen bereitzustellen)
Dann benötigen Sie in diesen beiden Anweisungen die Anweisung mit dem Controller-Feld (die dritte Anweisung),
Schließlich können diese überlappenden Methoden über den vierten Parameter der Link-Funktion referenziert werden.
<!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>
erklärt außerdem weiter, dass der Controller in der Anweisung zur Kommunikation zwischen verschiedenen Anweisungen verwendet wird.
Darüber hinaus können wir dem erforderlichen Parameterwert eines der folgenden Präfixe hinzufügen, was das Verhalten des Suchcontrollers ändert:
(1) Ohne Präfix sucht die Anweisung im von ihr bereitgestellten Controller. Wenn kein Controller gefunden wird, wird ein Fehler ausgegeben
(2)? Wenn der erforderliche Controller in der aktuellen Anweisung nicht gefunden wird, wird null an den vierten Parameter der Link-Verbindungsfunktion
übergeben(3)^Wenn der erforderliche Controller in der aktuellen Direktive nicht gefunden wird, wird nach dem Controller des übergeordneten Elements gesucht
(4)?^ Kombination