Table des matières
自定义指令
默认指令
Maison interface Web js tutoriel Pratique AngularJS utilisant NgModelController pour la liaison de données

Pratique AngularJS utilisant NgModelController pour la liaison de données

Dec 24, 2016 am 10:36 AM

Avant-propos

Dans les applications angulaires, la directive ng-model est un élément indispensable. Elle est utilisée pour lier la vue aux données et constitue une partie importante de la magie de la liaison bidirectionnelle. ngModelController est le contrôleur défini dans la directive ng-model. Ce contrôleur contient des services de liaison de données, de validation, de mises à jour CSS, ainsi que de formatage et d'analyse des valeurs. Il n'est pas utilisé pour le rendu DOM ou l'écoute des événements DOM. La logique liée au DOM doit être incluse dans d'autres instructions, puis laisser ces instructions essayer la fonction de liaison de données dans ngModelController.

Remarque : Cet article n'est pas une explication de la documentation de NgModelController, mais est plus pratique. Ensuite, je vous guiderai tout au long du processus pour implémenter une instruction personnalisée et utiliser l'attribut ng-model pour lier les données des deux côtés.

Exemple

Notre application utilise une instruction personnalisée nommée timeDruation

comme suit

<div ng-app="HelloApp" ng-controller="HelloController">
 <h1 id="自定义指令">自定义指令</h1>
 <time-duration ng-model="test"></time-duration>
 <h1 id="默认指令">默认指令</h1>
 <input ng-model="test">second
</div>
Copier après la connexion


Le code JS est le suivant,

angular.module(&#39;HelloApp&#39;, [])
 .directive(&#39;timeDuration&#39;, TimeDurationDirective);
 .controller(&#39;HelloController&#39;, function($scope) {
 $scope.test = 1;
 });
Copier après la connexion

, plusieurs unités de temps communes peuvent être spécifiées et des données peuvent être saisies. Enfin, nous obtiendrons le nombre de secondes correspondant. La capture d'écran de sa fonction est la suivante,


Ici, nous lions spécialement la variable de test à nos instructions personnalisées et à nos instructions par défaut respectivement pour observer son effet.

Commande personnaliséePratique AngularJS utilisant NgModelController pour la liaison de données

Sans plus tard, jetons un coup d'œil au code

Regardons d'abord le modèle de la commande. Comme le montre l'image ci-dessus, la commande contient une zone de saisie et une zone de sélection déroulante.

<div class="time-duration">
 <input ng-model=&#39;num&#39;>
 <select ng-model=&#39;unit&#39;>
 <option value="seconds">Seconds</option>
 <option value="minutes">Minutes</option>
 <option value="hours">Hours</option>
 <option value="days">Days</option>
 </select>
</div>
Copier après la connexion

Le modèle est en fait très simple, je n'entrerai donc pas dans les détails ici. Jetons un coup d'œil à la partie logique de cette instruction.


function TimeDurationDirective() {
 var tpl = &#39;....&#39;; // 指令模板代码就是上面的内容,这里就不复制了。
  
 return {
 restrict: &#39;E&#39;,
 replace: true,
 template: tpl,
 require: &#39;ngModel&#39;,
 scope: {},
 link: function(scope, element, attrs, ngModelController) {
  var multiplierMap = {
  seconds: 1,
  minutes: 60,
  hours: 3600,
  days: 86400
  };
  var multiplierTypes = [&#39;seconds&#39;, &#39;minutes&#39;, &#39;hours&#39;, &#39;days&#39;];
 
  // TODO
 }
 };
}
Copier après la connexion

Nous TODO la méthode de lien de l'instruction temporairement. Il sera progressivement amélioré par la suite.

Permettez-moi d'abord de jeter un œil à la définition de cette directive, qui utilise l'instruction require. En termes simples, la fonction de require est de déclarer une relation de dépendance pour cette directive, indiquant que cette directive dépend de l'attribut contrôleur d'une autre directive.

Voici une brève explication de l'utilisation dérivée de require.

On peut ajouter des quantificateurs rhétoriques avant d'exiger, par exemple,

return {
 require: &#39;^ngModel&#39;
}
 
return {
 require: &#39;?ngModel&#39;
}
 
return {
 require: &#39;?^ngModel&#39;
}
Copier après la connexion

1. La modification du préfixe ^ indique que la recherche est autorisé L'instruction parent de l'instruction actuelle Si le contrôleur de l'instruction correspondante est introuvable, une erreur sera générée.


2. ? signifie transformer cette action requise en option, ce qui signifie que si le contrôleur de l'instruction correspondante ne peut pas être trouvé, aucune erreur ne sera générée.


3. Bien entendu, nous pouvons également utiliser ces deux modifications de préfixe en combinaison.


Par rapport à ?ngModel, nous utilisons ^ngModel plus fréquemment.

Par exemple

<my-directive ng-model="my-model">
 <other-directive></other-directive>
</my-directive>
Copier après la connexion

À l'heure actuelle, nous utilisons require : ^ngModel dans une autre directive, et ce sera Recherchez automatiquement l'attribut du contrôleur dans la déclaration de ma-directive.

Utiliser NgModelController

Après avoir déclaré require: 'ngModel', le quatrième paramètre sera injecté dans la méthode de lien. Ce paramètre est le contrôleur correspondant à l'instruction dont nous avons besoin. Voici le contrôleur ngModeController de l'instruction intégrée ngModel.


link: function (scope, element, attrs, ngModelCtrl) {
 // TODO
}
Copier après la connexion

$viewValue et $modelValue


Il y a deux attributs très importants dans ngModelController, l'un est appelé $viewValue et l'un s'appelle $modeValue.

L'explication officielle de la signification de ces deux-là est la suivante

$viewValue : valeur de chaîne réelle dans la vue.

$modelValue : la valeur dans le modèle auquel le contrôle est lié.


Si vous avez des doutes sur l'explication officielle ci-dessus, je vais vous donner ici mon explication personnelle.

$viewView est la valeur utilisée par l'instruction pour restituer le modèle, et $modelView est la valeur circulée dans le contrôleur. Plusieurs fois, ces deux valeurs peuvent être différentes.

Par exemple, si vous affichez une date sur la page, elle peut afficher une chaîne comme "20 octobre 2015", mais la valeur correspondante de cette chaîne dans le contrôleur peut être une valeur Javascript. Objet de date.

Pour un autre exemple, dans notre exemple temps-durée, $viewValue fait en fait référence à la valeur combinée avec num et unit dans le modèle d'instruction, tandis que $modelValue est la valeur correspondant à la variable de test dans HelloAppController.

$formatters et $parses

En plus des deux propriétés $viewValue et $modelValue, il existe deux méthodes pour les gérer. Ce sont respectivement $parses et $formatters.

Le premier consiste à changer $viewValue->$modelValue, tandis que le second est tout le contraire, à $modelValue->$viewValue.

L'instruction temps-durée ainsi que le contrôleur externe et son fonctionnement interne sont comme indiqué ci-dessous,

Pratique AngularJS utilisant NgModelController pour la liaison de données

1、在外部控制器中(即这里的HelloApp的controller),我们通过ng-model="test"将test变量传入指令time-duration中,并建立绑定关系。

2、在指令内部,$modelValue其实就是test值的一份拷贝。

3、我们通过$formatters()方法将$modelValue转变成$viewValue。

4、然后调用$render()方法将$viewValue渲染到directive template中。

5、当我们通过某种途径监控到指令模板中的变量发生变化之后,我们调用$setViewValue()来更新$viewValue。

6、与(4)相对应,我们通过$parsers方法将$viewValue转化成$modelValue。

7、当$modelValue发生变化后,则会去更新HelloApp的UI。

完善指令逻辑

按照上面的流程,我们先来将$modelValue转化成$viewValue,然后在指令模板中进行渲染。

// $formatters接受一个数组
// 数组是一系列方法,用于将modelValue转化成viewValue
ngModelController.$formatters.push(function(modelValue) {
 var unit = &#39;minutes&#39;, num = 0, i, unitName;
 modelValue = parseInt(modelValue || 0);
  
 for (i = multiplierTypes.length-1; i >= 0; i--) {
 unitName = multiplierTypes[i];
 
 if (modelValue % multiplierMap[unitName] === 0) {
  unit = unitName;
  break;
 }
 }
  
 if (modelValue) {
 num = modelValue / multiplierMap[unit];
 }
 
 return {
 unit: unit,
 num: num
 };
});
Copier après la connexion


最后返回的对象就是$viewValue的value。(当然$viewValue还会有其他的一些属性。)

第二步,我们调用$render方法将$viewValue渲染到指令模板中去。

// $render用于将viewValue渲染到指令的模板中
ngModelController.$render = function() {
 scope.unit = ngModelCtrl.$viewValue.unit;
 scope.num = ngModelCtrl.$viewValue.num;
};
Copier après la connexion


第三步,我们通过$watch来监控指令模板中num和unit变量。当其发生变化时,我们需要更新$viewValue。

scope.$watch(&#39;unit + num&#39;, function() {
// $setViewValue用于更新viewValue
 ngModelController.$setViewValue({
 unit: scope.unit,
 num: scope.num
 });
});
Copier après la connexion


第四步,我们通过$parsers将$viewValue->$modelValue。

// $parsers接受一个数组
// 数组是一系列方法,用于将viewValue转化成modelValue
ngModelController.$parsers.push(function(viewValue) {
 var unit = viewValue.unit;
 var num = viewValue.num;
 var multiplier;
 
 multiplier = multiplierMap[unit];
 
 return num * multiplier;
});
Copier après la connexion

   

更多Pratique AngularJS utilisant NgModelController pour la liaison de données相关文章请关注PHP中文网!


Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
4 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Remplacer les caractères de chaîne en javascript Remplacer les caractères de chaîne en javascript Mar 11, 2025 am 12:07 AM

Explication détaillée de la méthode de remplacement de la chaîne JavaScript et de la FAQ Cet article explorera deux façons de remplacer les caractères de chaîne dans JavaScript: le code JavaScript interne et le HTML interne pour les pages Web. Remplacer la chaîne dans le code JavaScript Le moyen le plus direct consiste à utiliser la méthode Remplace (): str = str.replace ("trouver", "remplacer"); Cette méthode remplace uniquement la première correspondance. Pour remplacer toutes les correspondances, utilisez une expression régulière et ajoutez le drapeau global G: str = str.replace (/ fi

Tutoriel de configuration de l'API de recherche Google personnalisé Tutoriel de configuration de l'API de recherche Google personnalisé Mar 04, 2025 am 01:06 AM

Ce tutoriel vous montre comment intégrer une API de recherche Google personnalisée dans votre blog ou site Web, offrant une expérience de recherche plus raffinée que les fonctions de recherche de thème WordPress standard. C'est étonnamment facile! Vous pourrez restreindre les recherches à Y

8 Superbes plugins de mise en page JQuery Page 8 Superbes plugins de mise en page JQuery Page Mar 06, 2025 am 12:48 AM

Tirez parti de jQuery pour les dispositions de page Web sans effort: 8 plugins essentiels JQuery simplifie considérablement la mise en page de la page Web. Cet article met en évidence huit puissants plugins jQuery qui rationalisent le processus, particulièrement utile pour la création de sites Web manuels

Créez vos propres applications Web Ajax Créez vos propres applications Web Ajax Mar 09, 2025 am 12:11 AM

Vous voici donc, prêt à tout savoir sur cette chose appelée Ajax. Mais qu'est-ce que c'est exactement? Le terme Ajax fait référence à un regroupement lâche de technologies utilisées pour créer un contenu Web interactif dynamique. Le terme Ajax, inventé à l'origine par Jesse J

Qu'est-ce que & # x27; ceci & # x27; en javascript? Qu'est-ce que & # x27; ceci & # x27; en javascript? Mar 04, 2025 am 01:15 AM

Points de base Ceci dans JavaScript fait généralement référence à un objet qui "possède" la méthode, mais cela dépend de la façon dont la fonction est appelée. Lorsqu'il n'y a pas d'objet actuel, cela fait référence à l'objet global. Dans un navigateur Web, il est représenté par Window. Lorsque vous appelez une fonction, cela maintient l'objet global; mais lors de l'appel d'un constructeur d'objets ou de l'une de ses méthodes, cela fait référence à une instance de l'objet. Vous pouvez modifier le contexte de ceci en utilisant des méthodes telles que Call (), Appliquer () et Bind (). Ces méthodes appellent la fonction en utilisant la valeur et les paramètres donnés. JavaScript est un excellent langage de programmation. Il y a quelques années, cette phrase était

Améliorez vos connaissances jQuery avec le spectateur source Améliorez vos connaissances jQuery avec le spectateur source Mar 05, 2025 am 12:54 AM

JQuery est un excellent cadre JavaScript. Cependant, comme pour n'importe quelle bibliothèque, il est parfois nécessaire de passer sous le capot pour découvrir ce qui se passe. C'est peut-être parce que vous tracez un bug ou que vous êtes simplement curieux de savoir comment jQuery réalise une interface utilisateur particulière

10 feuilles de triche mobiles pour le développement mobile 10 feuilles de triche mobiles pour le développement mobile Mar 05, 2025 am 12:43 AM

Ce message compile des feuilles de triche utiles, des guides de référence, des recettes rapides et des extraits de code pour le développement d'Android, BlackBerry et Iphone. Aucun développeur ne devrait être sans eux! Guide de référence sur les gestes touchés (PDF) Une ressource précieuse pour Desig

Comment créer et publier mes propres bibliothèques JavaScript? Comment créer et publier mes propres bibliothèques JavaScript? Mar 18, 2025 pm 03:12 PM

L'article discute de la création, de la publication et du maintien des bibliothèques JavaScript, en se concentrant sur la planification, le développement, les tests, la documentation et les stratégies de promotion.

See all articles