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:
// 对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); }
$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:
function Car() { ... } Car.prototype = { run: function () {...} } function Benz() { var cat = new Car(); } Benz.prototype = { ... }
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;
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; }
function invoke(fn, self, locals, serviceName) { var args = [], $inject = annotate(fn, strictDi, serviceName); for (...) { key = $inject[i]; // 替换成依赖的对象 args.push( locals && locals.hasOwnProperty(key) ? 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:
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); })
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.

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

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

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

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

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

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

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

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


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

ZendStudio 13.5.1 Mac
Persekitaran pembangunan bersepadu PHP yang berkuasa

EditPlus versi Cina retak
Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

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 terkini

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),