cari
Rumahhujung hadapan webtutorial jsFikiran selepas mula-mula mengenali kerangka sudut_AngularJS

Oleh kerana keperluan pembangunan sebenar di tempat kerja, saya mula bersentuhan dengan rangka kerja sudut. Dari perbandingan awal, terseksa dan hancur dengan pelbagai masalah dan konsep, kini saya mempunyai kefahaman tertentu dan merasakan keperluan untuk merumuskan secara ringkas pemahaman saya. Mohon maaf atas segala kekurangan.

1. Pengikatan data dua hala
Pelbagai rangka kerja MV** kini popular dalam industri, dan rangka kerja berkaitan sentiasa muncul, dan sudut adalah salah satu daripadanya (MVVM). Malah, isu teras rangka kerja MV** adalah untuk memisahkan lapisan paparan daripada model, mengurangkan gandingan kod dan mencapai pemisahan data dan prestasi MVC, MVP dan MVVM semuanya mempunyai matlamat yang sama. tetapi perbezaan antara mereka Ia terletak pada cara mengaitkan lapisan model dengan pandangan.

Cara data mengalir dalam model dan lapisan paparan telah menjadi kunci kepada masalah Angular melaksanakan pengikatan dua hala data melalui pemeriksaan kotor. Apa yang dipanggil pengikatan dua hala bermakna perubahan dalam paparan boleh dicerminkan dalam lapisan model, dan perubahan dalam data model boleh dicerminkan dalam paparan. Jadi bagaimanakah Angular mencapai pengikatan dua hala Mengapa ia menjadi semakan kotor? Mari mulakan dengan soalan asal di bahagian hadapan:

html:

 <input type="button" value="increase 1" id="J-increase" />
 <span id="J-count"></span>

js:

 <script>
 var bindDate = {
  count: 1,
  appy: function () {
   document.querySelector('#J-count').innerHTML = this.count;
  },
  increase: function () {
   var _this = this;
   document.querySelector('#J-increase').addEventListener('click', function () {
    _this.count++;
    appy();
   }, true);
  },
  initialize: function () {
    // 初始化
   this.appy();
    //
   this.increase();
   }
  };
  bindDate.initialize();
 </script>

Dalam contoh di atas, terdapat dua proses:

Lapisan paparan mempengaruhi lapisan model: Mengklik butang pada halaman menyebabkan bilangan kiraan data meningkat sebanyak 1
Lapisan model mencerminkan lapisan paparan: Selepas kiraan berubah, ia dicerminkan pada lapisan paparan melalui fungsi guna
Ini adalah pemprosesan data yang sebelum ini dilaksanakan menggunakan perpustakaan seperti jquery dan YUI Masalah di sini adalah jelas:

  • Melibatkan banyak operasi DOM;
  • Prosesnya menyusahkan;
  • Gandingan kod terlalu tinggi, menjadikannya sukar untuk menulis ujian unit.
  • Mari kita lihat cara sudut memproses data:
Langkah pertama Tambahkan pemerhati: apabila data berubah, objek yang perlu dikesan perlu didaftarkan dahulu

Langkah kedua semakan kotor: apabila data di bawah skop tertentu berubah, anda perlu melintasi dan mengesan $$watchers yang berdaftar = [...]
// 对angular里面的源码进行了精简 
 $watch: function(watchExp, listener, objectEquality) {
  var scope = this,
   array = scope.$$watchers,
  watcher = {
    fn: listener,
    last: initWatchVal,
   get: get,
   exp: watchExp,
    eq: !!objectEquality
  };
  if (!array) {
   array = scope.$$watchers = [];
 }
  array.unshift(watcher);
 }

Ini mencapai pengikatan data dua hala Adakah pelaksanaan di atas serupa dengan acara tersuai? Anda boleh melihat bahawa corak reka bentuk pemerhati atau (penerbit-pelanggan) digunakan.
 $digest: function() {
 while (length--) {
   watch = watchers[length];
  watch.fn(value, lastValue, scope);
 }
 }

2. Suntikan kebergantungan

Pelajar yang telah menggunakan rangka kerja spring tahu bahawa Ioc dan AOP ialah dua konsep yang paling penting dalam musim bunga, dan Ioc boleh digunakan untuk menyuntik kebergantungan (DI) Jelas sekali bahawa sudut mempunyai warna hujung belakang yang sangat kuat. Begitu juga, mari kita lihat dahulu cara menyelesaikan kesalingbergantungan objek tanpa menggunakan DI:

Dalam contoh di atas, kelas Benz bergantung pada kelas Kereta, dan pergantungan ini diselesaikan terus melalui dalaman Baharu. Kelemahan ini sangat jelas Gandingan kod menjadi lebih tinggi, yang tidak kondusif untuk penyelenggaraan. Rangka kerja bahagian belakang telah lama menyedari masalah ini Pada masa awal, musim bunga mendaftarkan kebergantungan antara objek dalam fail xml Kemudian, ia menyelesaikan masalah DI dengan lebih mudah melalui anotasi lihat pada kod bahagian belakang.
 function Car() {
 ...
}
 Car.prototype = {
 run: function () {...}
}
 
function Benz() {
 var cat = new Car();
 }
Benz.prototype = {
  ...
}


Bahasa js itu sendiri tidak mempunyai mekanisme anotasi, jadi bagaimanakah sudut melaksanakannya?

1. Anotasi simulasi

 // 注解的模拟
 function annotate(fn, strictDi, name) {
 var $inject;
 if (!($inject = fn.$inject)) {
  $inject = [];
  $inject.push(name);
 }else if (isArray(fn)) {
  $inject = fn.slice(0, last);
 }
  return $inject;
 }
 createInjector.$$annotate = annotate;
2. Penciptaan objek suntikan

 function createInjector(modulesToLoad, strictDi) {
  //通过singleton模式创建对象
  var providerCache = {
    $provide: {
      provider: supportObject(provider),
      factory: supportObject(factory),
      service: supportObject(service),
      value: supportObject(value),
      constant: supportObject(constant),
     decorator: decorator
   }
   },
  instanceCache = {},
  instanceInjector = (instanceCache.$injector =
  createInternalInjector(instanceCache, function(serviceName, caller) {
  var provider = providerInjector.get(serviceName + providerSuffix, caller);
     return instanceInjector.invoke(provider.$get, provider, undefined, serviceName);
    }));
 return instanceInjector;
 }


3. Dapatkan objek suntikan

Pada ketika ini, adakah anda telah melihat banyak idea reka bentuk rangka kerja belakang hanya simulasi satu tanpa anotasi. berakhir"
function invoke(fn, self, locals, serviceName) {
 var args = [],
  $inject = annotate(fn, strictDi, serviceName);

 for (...) {
  key = $inject[i];
   // 替换成依赖的对象
   args.push(
   locals && locals.hasOwnProperty(key)
     &#63; locals[key]
    : getService(key, serviceName)
   );
 }
  if (isArray(fn)) {
  fn = fn[length];
  }   
  return fn.apply(self, args);
}

3.komunikasi pengawal

Dalam pembangunan sebenar, sistem aplikasi akan menjadi sangat besar. Adalah mustahil untuk aplikasi aplikasi hanya mempunyai satu pengawal, jadi terdapat kemungkinan komunikasi antara pengawal yang berbeza Terdapat dua cara utama untuk menyelesaikan masalah biasa ini:

1. Mekanisme acara:

Daftar acara di $rootScope Masalahnya ialah terlalu banyak acara akan didaftarkan pada $rootScope, yang akan menyebabkan beberapa masalah seterusnya.

 //controller1
app.controller('controller1', function ($rootScope) {
 $rootScope.$on('eventType', function (arg) {
    ......
  })
 })

// controller2
app.controller('controller2', function ($rootScope) {
   $rootScope.$emit('eventType',arg);
 or
  $rootScope.$broadcast('eventType',arg);
 })
2. Gunakan sepenuhnya ciri DI bagi perkhidmatan sudut melalui:

dan gunakan ciri bahawa perkhidmatan adalah satu tunggal untuk bertindak sebagai jambatan antara pengawal yang berbeza

4.Ciri perkhidmatan

1. Singleton: Hanya perkhidmatan dalam sudut boleh melakukan DI seperti pengawal dan arahan tidak mempunyai fungsi ini secara literal tidak berkaitan dengan perniagaan tertentu, manakala pengawal dan arahan berkait rapat dengan perniagaan tertentu, jadi keunikan perkhidmatan perlu dipastikan.

2. lazy new: angular akan mula-mula menjana penyedia perkhidmatan, tetapi tidak serta-merta menjana perkhidmatan yang sepadan Ia hanya akan membuat seketika perkhidmatan ini apabila ia diperlukan. .

3. Pembekal) klasifikasi: pembekal(), kilang, perkhidmatan, nilai, pemalar, di mana penyedia adalah pelaksanaan paling rendah, dan kaedah lain berdasarkannya Gula sintaksis ( gula), perlu diperhatikan bahawa perkhidmatan ini akhirnya akan menambah kaedah $get, kerana perkhidmatan khusus dihasilkan dengan melaksanakan kaedah $get.

5. Pelaksanaan arahan
Penyusunan arahan merangkumi dua peringkat: menyusun dan memaut. Secara ringkasnya, fasa penyusunan terutamanya berkaitan dengan templat DOM Pada masa ini, isu skop tidak terlibat, iaitu, tiada pemaparan data dilakukan Sebagai contoh, arahan ngRepeate mengubah templat melalui kompilasi , fungsi pautan akan dikembalikan, menimpa pautan yang ditakrifkan kemudiannya digunakan terutamanya untuk pemaparan data, yang dibahagikan kepada dua pautan: pra-pautan dan pasca pautan adalah terbalik. Pautan pasca menghuraikan bahagian dalaman dahulu, dan kemudian bahagian luaran Ini mempunyai kesan yang besar pada arahan adalah selamat kerana arahan juga boleh menyertakan arahan Pada masa yang sama, pautan memproses DOM sebenar, yang akan melibatkan isu prestasi dalam operasi DOM.

Kandungan yang diliputi dalam artikel ini tidak begitu universal, dan akan ada suplemen yang sepadan nanti. Saya harap semua orang juga boleh belajar dan membincangkan rangka kerja sudut.

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
聊聊Angular中的元数据(Metadata)和装饰器(Decorator)聊聊Angular中的元数据(Metadata)和装饰器(Decorator)Feb 28, 2022 am 11:10 AM

本篇文章继续Angular的学习,带大家了解一下Angular中的元数据和装饰器,简单了解一下他们的用法,希望对大家有所帮助!

angular学习之详解状态管理器NgRxangular学习之详解状态管理器NgRxMay 25, 2022 am 11:01 AM

本篇文章带大家深入了解一下angular的状态管理器NgRx,介绍一下NgRx的使用方法,希望对大家有所帮助!

浅析angular中怎么使用monaco-editor浅析angular中怎么使用monaco-editorOct 17, 2022 pm 08:04 PM

angular中怎么使用monaco-editor?下面本篇文章记录下最近的一次业务中用到的 monaco-editor 在 angular 中的使用,希望对大家有所帮助!

Angular + NG-ZORRO快速开发一个后台系统Angular + NG-ZORRO快速开发一个后台系统Apr 21, 2022 am 10:45 AM

本篇文章给大家分享一个Angular实战,了解一下angualr 结合 ng-zorro 如何快速开发一个后台系统,希望对大家有所帮助!

项目过大怎么办?如何合理拆分Angular项目?项目过大怎么办?如何合理拆分Angular项目?Jul 26, 2022 pm 07:18 PM

Angular项目过大,怎么合理拆分它?下面本篇文章给大家介绍一下合理拆分Angular项目的方法,希望对大家有所帮助!

聊聊自定义angular-datetime-picker格式的方法聊聊自定义angular-datetime-picker格式的方法Sep 08, 2022 pm 08:29 PM

怎么自定义angular-datetime-picker格式?下面本篇文章聊聊自定义格式的方法,希望对大家有所帮助!

浅析Angular中的独立组件,看看怎么使用浅析Angular中的独立组件,看看怎么使用Jun 23, 2022 pm 03:49 PM

本篇文章带大家了解一下Angular中的独立组件,看看怎么在Angular中创建一个独立组件,怎么在独立组件中导入已有的模块,希望对大家有所帮助!

聊聊Angular Route中怎么提前获取数据聊聊Angular Route中怎么提前获取数据Jul 13, 2022 pm 08:00 PM

Angular Route中怎么提前获取数据?下面本篇文章给大家介绍一下从 Angular Route 中提前获取数据的方法,希望对大家有所帮助!

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Persekitaran pembangunan bersepadu PHP yang berkuasa

EditPlus versi Cina retak

EditPlus versi Cina retak

Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

MantisBT

MantisBT

Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

mPDF

mPDF

mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),