ホームページ  >  記事  >  ウェブフロントエンド  >  Angularjs でカスタム ディレクティブを使用するためのヒントのまとめ

Angularjs でカスタム ディレクティブを使用するためのヒントのまとめ

php中世界最好的语言
php中世界最好的语言オリジナル
2018-04-27 13:43:221207ブラウズ

今回はAngularjsでカスタム命令を使用する際の注意事項についてまとめました。以下は実際的なケースです。

1: カスタム命令に一般的に使用されるテンプレート

以下は大まかな説明であり、言及されていない詳細と重要な関連知識については後で説明します:

angular.module('yelloxingApp', []).directive('uiDirective', function() {
  return {  
    restrict:String,//标明该指令可以在模板中用于元素E、属性A、类C和注释M或组合    
    priority:Number,//设置指令执行优先级,在某个DOM上优先级高的会先执行
        terminal:Boolean,    
    template:String or Template Function,//就是设置模板,和下面的templateUrl属性二个只可以设置一个,目的一样    
    templateUrl:String or Template Function,//除了字符串,这二个属性还可以设置函数    
    replace:Boolean,//指令模板是否替换原来的元素    
    scope:Boolean or Object,
    controller:String or function(scope, element, attrs) { ... },    
    require:String or Array,    
    //你需要知道link在每个实例都执行一遍,compile全程只会执行一遍
    link: function(scope, element, attrs,ctrl) { ... },    
    compile:function(element, attrs) {
      //常用的就是compile的此处写执行一次的代码,或者在link方法里面写和dom有关的操作
    }
  };
});

2: いくつかの属性の説明

[スコープ]

最初にブール値について説明します。これは比較的単純です:

1. true に設定すると、子スコープになります。この場合、親スコープを直接使用します。

別のオブジェクト設定方法があります。これは、分離スコープを使用する場合、分離の外側の場所と対話するための 3 つのメソッドが提供されています。以下に 1 つずつ説明する例を示します。

コントローラー

の内容を見てみましょう:

angular.module('yelloxingApp', []).directive("scopeExample", ['$rootScope', function($rootScope) {
  return {
    restrict: 'A',    
    scope: {
      _userDataName: "=userDataName",
      _onSend: "&onSend",
      _fromName: "@fromName"
    },    
    template: `
      <button ng-click="_useParentMethod()">
        点击按钮调用父级的方法
      </button>
      
      <input ng-model="_userDataName"/>
      <ul>
        <li>fromName={{newfromname}}</li>
        <li>这是从父级获取到的{{_userDataName}}</li>
      </ul>`,
       link: function($scope, element, attrs) {
      //使用@符号可将本地作用域的变量与DOM属性的值进行绑定,即这里通过@得到父类fromName的值
      $scope.newfromname = $scope._fromName;
      $scope._useParentMethod = function() {      
        //使用&符号可以在其中调用父类的方法
        $scope._onSend({ "email": { "email": "yelloxing@gmail.com" } });
        console.log($scope._userDataName);        
      };
    }
  };
}]);

最後に、忘れずにHTMLで使用してください:

コードをコピーします

コードは次のとおりです:

< ;pscope-example user-data-name="user" on-send='sendMail(email)' from-name={{name}}>

【必須】

別のコントローラーをリクエストを指定し、それを 4 番目のリンク メソッドとして使用します。 パラメーターを渡す際に注意する必要があるのは、コントローラーを見つける方法です。

コントローラーを見つける方法は次のように理解できます: use?現在のコマンドで必要なコントローラーが見つからない場合、リンク関数の 4 番目のパラメーターとして null が渡されることを示します。 ^ プレフィックスが追加されている場合、コマンドは、require パラメーターで指定されたコントローラーを検索します。上流のコマンド チェーンでは、require: "?^ngModel" のように組み合わせることもできます。プレフィックスがない場合、その命令は、コントローラー (または指定された名前の命令) が存在しない場合、そのコントローラー内で検索されます。見つかった場合はミスが発生します。

[ターミナル]

属性ターミナル: true の場合、現在の命令よりも優先度の低い命令は実行されず、この命令のみが実行されます。

3: ビューとモデルの間のデータのフォーマット

は、filter の機能に似ています。場合によっては、合意を容易にするために、ある種の翻訳後にデータをページに表示したいことがあります。データベース 単純なシリアル番号の方が有益であるため、この機能を実現するには、リンク内で次のメソッドを使用する必要がある場合があります:

1.ctrl.$formatters.unshift(function(input) {//モデルからビューへのデータの書式設定} ); 2.ctrl.$parsers.unshift(function(input) {//ビューからモデルへのデータの書式設定})。

上記の $formatters と $parsers は、ビューからモデルとモデルからビューの 2 つのキューであり、内部で定義されたメソッドによるフィルタリングを容易にし、パイプライン フローに似ており、最終的に宛先に流れます。

コントローラーを見つけるために、require: "?ngModel" のようなステートメントを設定することを忘れないでください。

4: ビューとモデルデータの同期の問題

コマンドの jquery を介して入力データが変更されることがありますが、angularjs はそれを認識しません。このとき、次のいずれかの方法を選択できます。入力ボックスの変更をトリガーし、Angularjs にデータが変更されたことを検出させ、$setViewValue(value) を呼び出してデータを同期します: $("input").trigger("change");2. viewValue への値の同期と、modelValue の動作: ctrl.$setViewValue($scope.info)。

5: いくつかの断片的なテクニック

1. 入力ボックスが有効かどうかに応じて true または false を設定します: ctrl.$setValidity(errorType, boolean);//errorType はエラー カテゴリを表し、カスタマイズできます

2.監視仕様 モデル値はもちろん、コレクションを監視するメソッドもあります: $scope.$watch(attrs['ngModel'], function(newValue, oldValue) {});

3. angularjs で管理する必要がある場合は、$compile(newHtml)($scope) メソッドを使用してコンパイルできます。


この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。

推奨読書:

Angular CLI を使用して Angular プロジェクトを作成する手順の詳細な説明

Yuanshengjs でハフマン コーディングを実装する手順の詳細な説明

以上がAngularjs でカスタム ディレクティブを使用するためのヒントのまとめの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。