Maison interface Web js tutoriel Seulement 30 lignes de code pour implémenter les techniques MVC_javascript en Javascript

Seulement 30 lignes de code pour implémenter les techniques MVC_javascript en Javascript

May 16, 2016 pm 03:15 PM
javascript mvc

Depuis 2009 environ, MVC s'est progressivement illustré dans le domaine du front-end, pour finalement inaugurer une grosse explosion avec le lancement de React Native en 2015 : AngularJS, EmberJS, Backbone, ReactJS, RiotJS, VueJS... .. Une série de noms sont apparus et ont changé de manière spectaculaire. Certains d'entre eux ont progressivement disparu de la vue de tous, certains continuent de croître rapidement et certains ont déjà pris leur propre rôle dans un environnement écologique spécifique. Quoi qu’il en soit, MVC a et continuera d’influencer profondément la façon de penser et les méthodes de travail des ingénieurs front-end.

De nombreux exemples d'explication de MVC partent d'un certain concept d'un framework spécifique, comme la collection Backbone ou le modèle dans AngularJS. C'est certainement une bonne approche. Mais la raison pour laquelle un framework est un framework, et non une bibliothèque de classes (jQuery) ou un ensemble d'outils (Underscore), est qu'il existe de nombreux excellents concepts de conception et bonnes pratiques derrière eux. Ces essences de conception se complètent, sont imbriquées et. sont indispensables, il n'est pas facile de voir l'essence d'un certain modèle de conception à travers un cadre complexe en peu de temps.

C'est l'origine de cet essai : le code prototype créé pour aider tout le monde à comprendre le concept doit être aussi simple que possible, juste assez simple pour que tout le monde puisse comprendre le concept.

1. La base de MVC est le modèle d'observateur, qui est la clé pour réaliser la synchronisation entre le modèle et la vue
Pour plus de simplicité, chaque instance de modèle ne contient qu'une seule valeur primitive.

function Model(value) {
  this._value = typeof value === 'undefined' ? '' : value;
  this._listeners = [];
}
Model.prototype.set = function (value) {
  var self = this;
  self._value = value;
  // model中的值改变时,应通知注册过的回调函数
  // 按照Javascript事件处理的一般机制,我们异步地调用回调函数
  // 如果觉得setTimeout影响性能,也可以采用requestAnimationFrame
  setTimeout(function () {
    self._listeners.forEach(function (listener) {
      listener.call(self, value);
    });
  });
};
Model.prototype.watch = function (listener) {
  // 注册监听的回调函数
  this._listeners.push(listener);
};
Copier après la connexion
// html代码:
<div id="div1"></div>
// 逻辑代码:
(function () {
  var model = new Model();
  var div1 = document.getElementById('div1');
  model.watch(function (value) {
    div1.innerHTML = value;
  });
  model.set('hello, this is a div');
})();
Copier après la connexion

Avec l'aide du modèle d'observateur, nous avons réalisé que lorsque la méthode set du modèle est appelée pour changer sa valeur, le modèle est également mis à jour de manière synchrone, mais cette implémentation est très délicate car nous devons surveiller manuellement le changement de la valeur du modèle (via la méthode watch ) et transmettre une fonction de rappel. Existe-t-il un moyen de faciliter la liaison de la vue (un ou plusieurs nœuds dom) au modèle ?

2. Implémentez la méthode bind et liez le modèle et la vue

Model.prototype.bind = function (node) {
  // 将watch的逻辑和通用的回调函数放到这里
  this.watch(function (value) {
    node.innerHTML = value;
  });
};
Copier après la connexion
// html代码:
<div id="div1"></div>
<div id="div2"></div>
// 逻辑代码:
(function () {
  var model = new Model();
  model.bind(document.getElementById('div1'));
  model.bind(document.getElementById('div2'));
  model.set('this is a div');
})();
Copier après la connexion

Grâce à une simple encapsulation, la liaison entre la vue et le modèle a pris forme. Même si plusieurs vues doivent être liées, elle est facile à mettre en œuvre. Notez que bind est une méthode native sur le prototype de la classe Function, mais elle n'est pas étroitement liée à MVC. L'auteur aime vraiment le mot bind. Il est précis et concis, je couvre donc simplement la méthode native ici. . Plus près de nous, même si la complexité de la liaison a été réduite, cette étape nécessite toujours que nous la complétions manuellement. Est-il possible de dissocier complètement la logique de liaison du code métier ?

3. Implémentez un contrôleur pour découpler la liaison du code logique

Des amis attentifs ont peut-être remarqué que même si nous parlons de MVC, seule la classe Model apparaît dans l'article ci-dessus. Il est compréhensible que la classe View n'apparaisse pas. Après tout, HTML est une View prête à l'emploi (en fait). , cet article le mentionne également du début à la fin. En utilisant simplement HTML comme View, la classe View n'apparaît pas dans le code javascript), alors pourquoi la classe Controller est-elle invisible ? Ne vous inquiétez pas, en fait, ce qu'on appelle le « code logique » est un segment de code avec un degré élevé de couplage entre la logique du framework (appelons le prototype de cet article un framework) et la logique métier.
Si vous souhaitez laisser la logique de liaison au framework, vous devez indiquer au framework comment effectuer la liaison. Comme il est difficile de compléter une annotation en JS, nous pouvons effectuer cette couche de balisage dans la vue - utiliser l'attribut tag de HTML est un moyen simple et efficace.

function Controller(callback) {
  var models = {};
  // 找到所有有bind属性的元素
  var views = document.querySelectorAll('[bind]');
  // 将views处理为普通数组
  views = Array.prototype.slice.call(views, 0);
  views.forEach(function (view) {
    var modelName = view.getAttribute('bind');
    // 取出或新建该元素所绑定的model
    models[modelName] = models[modelName] || new Model();
    // 完成该元素和指定model的绑定
    models[modelName].bind(view);
  });
  // 调用controller的具体逻辑,将models传入,方便业务处理
  callback.call(this, models);
}




Copier après la connexion
// html:
<div id="div1" bind="model1"></div>
<div id="div2" bind="model1"></div>
// 逻辑代码:
new Controller(function (models) {
  var model1 = models.model1;
  model1.set('this is a div');
});


Copier après la connexion

Est-ce si simple ? C'est aussi simple que cela. L'essence de MVC est de compléter la logique métier dans le contrôleur et de modifier le modèle. En même temps, les modifications apportées au modèle entraînent des mises à jour automatiques de la vue. Ces logiques sont reflétées dans le code ci-dessus et prennent en charge plusieurs vues et plusieurs modèles. Bien que cela ne soit pas suffisant pour les projets de production, j'espère que cela sera quelque peu utile à l'apprentissage MVC de chacun.

Le code "framework" organisé avec les commentaires supprimés :

function Model(value) {
  this._value = typeof value === 'undefined' &#63; '' : value;
  this._listeners = [];
}
Model.prototype.set = function (value) {
  var self = this;
  self._value = value;
  setTimeout(function () {
    self._listeners.forEach(function (listener) {
      listener.call(self, value);
    });
  });
};
Model.prototype.watch = function (listener) {
  this._listeners.push(listener);
};
Model.prototype.bind = function (node) {
  this.watch(function (value) {
    node.innerHTML = value;
  });
};
function Controller(callback) {
  var models = {};
  var views = Array.prototype.slice.call(document.querySelectorAll('[bind]'), 0);
  views.forEach(function (view) {
    var modelName = view.getAttribute('bind');
    models[modelName] = models[modelName] || new Model();
    models[modelName].bind(view);
  });
  callback.call(this, models);
}
Copier après la connexion

Post-scriptum :

Dans le processus d'apprentissage de Flux et Redux, bien que l'auteur maîtrise l'utilisation des outils, je le connais seulement mais je ne sais pas pourquoi j'ai toujours souligné "Flux évite MVC en faveur d'un flux de données unidirectionnel". dans la documentation officielle de ReactJS. Je ne comprends pas très bien. J'ai toujours l'impression que le flux de données unidirectionnel et MVC n'entrent pas en conflit. Je ne comprends pas pourquoi les deux sont opposés dans le document ReactJS. est un sans lui (éviter, éviter). Finalement, j'ai décidé de revenir à la définition de MVC et de l'étudier à nouveau. Bien que je copie et colle négligemment dans mon travail quotidien, nous devons quand même être volontaires et mâcher les mots de temps en temps, n'est-ce pas ? Cette méthode m'a vraiment aidé à comprendre cette phrase. Ici, je peux partager mes réflexions avec vous : La raison pour laquelle je pense que le flux de données unidirectionnel dans MVC et le flux est similaire peut être due au fait qu'il n'y a pas de distinction claire entre MVC et le modèle d'observateur. . Causé par la relation - MVC est basé sur le modèle d'observateur, tout comme le flux, donc la source de cette similarité est le modèle d'observateur, et non MVC et le flux eux-mêmes. Cette compréhension est également confirmée dans le livre de modèles de conception original du quatuor : "Le premier exemple, et peut-être le plus connu, du modèle Observer apparaît dans Smalltalk Model/View/Controller (MVC), le cadre d'interface utilisateur dans l'environnement Smalltalk [KP88". ] La classe Model de MVC joue le rôle de Sujet, tandis que View est la classe de base pour les observateurs.

Si les lecteurs souhaitent continuer à développer un tel prototype de jouet, vous pouvez vous référer aux instructions suivantes :

  • 1. Implémenter la liaison bidirectionnelle des balises de classe d'entrée
  • 2. Obtenez un contrôle précis de la portée contrôlée par le contrôleur Ici, un contrôleur contrôle l'ensemble de l'arborescence DOM
  • .
  • 3. Implémentez la logique de masquage/affichage, création/destruction des nœuds dom dans la couche de vue
  • 4. Intégrez le dom virtuel, ajoutez la fonction dom diff et améliorez l'efficacité du rendu
  • 5. Fournir une fonction d'injection de dépendances pour réaliser l'inversion du contrôle
  • 6. Effectuez des contrôles de sécurité sur le contenu de l'affectation de innerHTML pour empêcher toute injection malveillante
  • 7. Mettre en œuvre la logique de collection de modèles, où chaque modèle n'a qu'une seule valeur
  • 8. Utilisez le setter dans es5 pour modifier l'implémentation de la méthode set, facilitant ainsi la modification du modèle
  • 9. Ajoutez un contrôle sur les attributs et les CSS dans la couche de vue
  • 10. Prend en charge une syntaxe similaire aux doubles accolades dans AngularJS, liant seulement une partie du HTML
  • ……

Un cadre complet doit subir d'innombrables améliorations et modifications. Ce n'est que la première étape. Le chemin est encore long. J'espère que tout le monde continuera à travailler dur.

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 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

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)

Comment mettre en œuvre un système de reconnaissance vocale en ligne à l'aide de WebSocket et JavaScript Comment mettre en œuvre un système de reconnaissance vocale en ligne à l'aide de WebSocket et JavaScript Dec 17, 2023 pm 02:54 PM

Comment utiliser WebSocket et JavaScript pour mettre en œuvre un système de reconnaissance vocale en ligne Introduction : Avec le développement continu de la technologie, la technologie de reconnaissance vocale est devenue une partie importante du domaine de l'intelligence artificielle. Le système de reconnaissance vocale en ligne basé sur WebSocket et JavaScript présente les caractéristiques d'une faible latence, d'un temps réel et d'une multiplateforme, et est devenu une solution largement utilisée. Cet article explique comment utiliser WebSocket et JavaScript pour implémenter un système de reconnaissance vocale en ligne.

WebSocket et JavaScript : technologies clés pour mettre en œuvre des systèmes de surveillance en temps réel WebSocket et JavaScript : technologies clés pour mettre en œuvre des systèmes de surveillance en temps réel Dec 17, 2023 pm 05:30 PM

WebSocket et JavaScript : technologies clés pour réaliser des systèmes de surveillance en temps réel Introduction : Avec le développement rapide de la technologie Internet, les systèmes de surveillance en temps réel ont été largement utilisés dans divers domaines. L'une des technologies clés pour réaliser une surveillance en temps réel est la combinaison de WebSocket et de JavaScript. Cet article présentera l'application de WebSocket et JavaScript dans les systèmes de surveillance en temps réel, donnera des exemples de code et expliquera leurs principes de mise en œuvre en détail. 1. Technologie WebSocket

Comment mettre en œuvre un système de réservation en ligne à l'aide de WebSocket et JavaScript Comment mettre en œuvre un système de réservation en ligne à l'aide de WebSocket et JavaScript Dec 17, 2023 am 09:39 AM

Comment utiliser WebSocket et JavaScript pour mettre en œuvre un système de réservation en ligne. À l'ère numérique d'aujourd'hui, de plus en plus d'entreprises et de services doivent fournir des fonctions de réservation en ligne. Il est crucial de mettre en place un système de réservation en ligne efficace et en temps réel. Cet article explique comment utiliser WebSocket et JavaScript pour implémenter un système de réservation en ligne et fournit des exemples de code spécifiques. 1. Qu'est-ce que WebSocket ? WebSocket est une méthode full-duplex sur une seule connexion TCP.

Comment utiliser JavaScript et WebSocket pour mettre en œuvre un système de commande en ligne en temps réel Comment utiliser JavaScript et WebSocket pour mettre en œuvre un système de commande en ligne en temps réel Dec 17, 2023 pm 12:09 PM

Introduction à l'utilisation de JavaScript et de WebSocket pour mettre en œuvre un système de commande en ligne en temps réel : avec la popularité d'Internet et les progrès de la technologie, de plus en plus de restaurants ont commencé à proposer des services de commande en ligne. Afin de mettre en œuvre un système de commande en ligne en temps réel, nous pouvons utiliser les technologies JavaScript et WebSocket. WebSocket est un protocole de communication full-duplex basé sur le protocole TCP, qui peut réaliser une communication bidirectionnelle en temps réel entre le client et le serveur. Dans le système de commande en ligne en temps réel, lorsque l'utilisateur sélectionne des plats et passe une commande

Architecture PHP MVC : créer des applications Web pour le futur Architecture PHP MVC : créer des applications Web pour le futur Mar 03, 2024 am 09:01 AM

Introduction Dans le monde numérique en évolution rapide d'aujourd'hui, il est crucial de créer des applications WEB robustes, flexibles et maintenables. L'architecture PHPmvc fournit une solution idéale pour atteindre cet objectif. MVC (Model-View-Controller) est un modèle de conception largement utilisé qui sépare les différents aspects d'une application en composants indépendants. Les fondements de l'architecture MVC Le principe fondamental de l'architecture MVC est la séparation des préoccupations : Modèle : encapsule les données et la logique métier de l'application. Vue : responsable de la présentation des données et de la gestion des interactions des utilisateurs. Contrôleur : coordonne l'interaction entre les modèles et les vues, gère les demandes des utilisateurs et la logique métier. Architecture PHPMVC L'architecture phpMVC suit le modèle MVC traditionnel mais introduit également des fonctionnalités spécifiques au langage. Ce qui suit est PHPMVC

JavaScript et WebSocket : créer un système efficace de prévisions météorologiques en temps réel JavaScript et WebSocket : créer un système efficace de prévisions météorologiques en temps réel Dec 17, 2023 pm 05:13 PM

JavaScript et WebSocket : Construire un système efficace de prévisions météorologiques en temps réel Introduction : Aujourd'hui, la précision des prévisions météorologiques revêt une grande importance pour la vie quotidienne et la prise de décision. À mesure que la technologie évolue, nous pouvons fournir des prévisions météorologiques plus précises et plus fiables en obtenant des données météorologiques en temps réel. Dans cet article, nous apprendrons comment utiliser la technologie JavaScript et WebSocket pour créer un système efficace de prévisions météorologiques en temps réel. Cet article démontrera le processus de mise en œuvre à travers des exemples de code spécifiques. Nous

Tutoriel JavaScript simple : Comment obtenir le code d'état HTTP Tutoriel JavaScript simple : Comment obtenir le code d'état HTTP Jan 05, 2024 pm 06:08 PM

Tutoriel JavaScript : Comment obtenir le code d'état HTTP, des exemples de code spécifiques sont requis Préface : Dans le développement Web, l'interaction des données avec le serveur est souvent impliquée. Lors de la communication avec le serveur, nous devons souvent obtenir le code d'état HTTP renvoyé pour déterminer si l'opération a réussi et effectuer le traitement correspondant en fonction de différents codes d'état. Cet article vous apprendra comment utiliser JavaScript pour obtenir des codes d'état HTTP et fournira quelques exemples de codes pratiques. Utilisation de XMLHttpRequest

Comment utiliser insertBefore en javascript Comment utiliser insertBefore en javascript Nov 24, 2023 am 11:56 AM

Utilisation : En JavaScript, la méthode insertBefore() est utilisée pour insérer un nouveau nœud dans l'arborescence DOM. Cette méthode nécessite deux paramètres : le nouveau nœud à insérer et le nœud de référence (c'est-à-dire le nœud où le nouveau nœud sera inséré).

See all articles