Heim  >  Artikel  >  Web-Frontend  >  AngularJS benutzerdefinierte Attribute von ng-model tag_AngularJS

AngularJS benutzerdefinierte Attribute von ng-model tag_AngularJS

WBOY
WBOYOriginal
2016-05-16 15:19:031329Durchsuche

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: '&#63;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): 3d2e5ffc584136bb402056fc25c74042fd34349817ec1e88fe5ef4ceedb13309

A (Attribut):a8212a3c97dec0df2bf895b4c3913a2016b28748ea4df4d9c2150843fecfba68

C (Klasse): c9319480cb6dde66254d6e5a18255f6c16b28748ea4df4d9c2150843fecfba68
M (Kommentar): 1e6309f9690257b4da2f913028604ecf

2.erforderlich

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>
Die Anweisungen innerDirective und innerDirective2 im obigen Beispiel verwenden die im Controller der Anweisung OuterDirective definierte Methode wieder

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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn