Rumah >hujung hadapan web >tutorial js >Panduan untuk Membina Komponen Sudut Kualiti 1.5
mata utama
$onInit
untuk mengurus tetapan dan pembongkaran komponen secara berkesan untuk memastikan sumber -sumbernya dimulakan dan dibersihkan dengan betul. $onDestroy
$scope
Artikel ini dikaji semula oleh Mark Brown dan Jurgen van de Moere. Terima kasih kepada semua pengulas rakan sebaya di SitePoint untuk mendapatkan kandungan SitePoint dengan sebaik -baiknya!
Dalam sudut 1, komponen adalah mekanisme untuk mewujudkan elemen HTML tersuai. Ini mungkin pada masa lalu dengan arahan sudut, tetapi komponen yang dibina atas pelbagai penambahbaikan untuk sudut dan menguatkuasakan amalan terbaik dalam bangunan dan reka bentuk.
Dalam artikel ini, kami akan menyelam ke dalam reka bentuk komponen dan cara menggunakannya dalam permohonan anda. Jika anda belum mula menggunakan komponen di Angular 1, anda boleh membaca tutorial baru -baru ini mengenai sintaks dan reka bentuk mereka. Matlamat saya adalah untuk menggariskan beberapa amalan terbaik yang akan meningkatkan kualiti permohonan anda.
Ia juga harus diperhatikan bahawa banyak amalan terbaik untuk Angular 2 telah diperkenalkan ke Angular 1 melalui API Komponen baru, yang membolehkan anda membina aplikasi yang lebih mudah untuk refactor kemudian. Angular 2 mempengaruhi cara kita berfikir dan merancang komponen Angular 1, tetapi masih terdapat banyak perbezaan yang jelas. Angular 1 masih merupakan alat yang sangat kuat untuk membina aplikasi, jadi saya percaya bahawa walaupun anda tidak akan pergi atau tidak bersedia untuk berhijrah ke Angular 2, ia bernilai melabur dalam menggunakan komponen untuk meningkatkan aplikasi anda.
Apakah komponen yang baik?
Marilah kita terlebih dahulu memahami mengapa dan bagaimana untuk mengasingkan dan merangkum komponen dari seluruh aplikasi.
Evolusi fungsi Angular 1 adalah untuk membolehkan komponen terpencil dan terkandung, untuk alasan yang baik. Sesetengah aplikasi awal sangat digabungkan dengan penggunaan pengawal $scope
dan bersarang. Pada mulanya Angular tidak memberikan penyelesaian, tetapi sekarang ia memilikinya.
Komponen yang baik tidak mendedahkan logik dalaman mereka. Ini mudah dicapai kerana cara mereka direka. Walau bagaimanapun, melainkan benar -benar diperlukan (mis., Acara hantar/penyiaran), penyalahgunaan penggunaan komponen $scope
harus dielakkan.
Komponen harus mengambil peranan tunggal. Ini sangat penting untuk kesesuaian, kebolehgunaan dan kesederhanaan. Adalah lebih baik untuk membuat komponen tambahan dan bukannya melebih -lebihkan komponen individu. Ini tidak bermakna anda tidak akan mempunyai komponen yang lebih besar atau lebih kompleks, ia hanya bermakna bahawa setiap komponen harus memberi tumpuan kepada kerja utamanya.
Saya membahagikan komponen ke dalam empat kumpulan utama berdasarkan peranan mereka dalam aplikasi untuk membantu anda memikirkan cara merancang komponen. Tidak ada sintaks yang berbeza untuk membina pelbagai jenis komponen -hanya mempertimbangkan peranan khusus yang diandaikan oleh komponen.
Jenis -jenis ini berdasarkan pengalaman 5+ tahun saya menggunakan Angular. Anda boleh memilih untuk mengatur sedikit berbeza, tetapi konsep asas adalah untuk memastikan bahawa komponen anda mempunyai peranan yang jelas.
Hanya satu komponen aplikasi yang boleh bertindak sebagai akar permohonan. Anda boleh memikirkannya sebagai hanya satu komponen dalam badan aplikasi web, di mana semua logik lain dimuatkan.
<code>> <app>></app>> > </code>
Ini terutamanya disyorkan untuk konsistensi reka bentuk Angular 2, jadi akan lebih mudah pada masa akan datang jika anda ingin berhijrah. Ia juga membantu dengan ujian dengan menggerakkan semua kandungan akar aplikasi ke dalam komponen tunggal (bukannya memasukkannya ke dalam fail index.html). Komponen permohonan juga memberi anda tempat untuk meneliti permohonan anda supaya anda tidak perlu melakukan ini dalam kaedah Run Application, yang meningkatkan kesesuaian dan mengurangkan kebergantungan pada $rootScope
.
Komponen ini semudah mungkin. Jika boleh, ia mungkin mengandungi hanya templat, tanpa sebarang pengikat atau pengawal. Walau bagaimanapun, ia tidak menggantikan ng-app
atau boot keperluan aplikasi.
Pada masa lalu, kami mengaitkan pengawal dan templat dalam keadaan ui-router (atau routing ngroute). Laluan ini kini boleh dihubungkan terus ke komponen, jadi komponen masih di mana pasangan pengawal dan templat, tetapi terdapat juga kelebihan yang boleh diperbaiki.
Sebagai contoh, menggunakan ui-router, iaitu cara kami menghubungkan templat dan pengawal.
<code>> <app>></app>> > </code>
Anda kini boleh menghubungkan URL terus ke komponen.
<code>$stateProvider.state('mystate', { url: '/', templateUrl: 'views/mystate.html', controller: MyStateController }); </code>
Komponen ini boleh mengikat data dari parameter penghalaan seperti ID projek, dan peranan mereka adalah untuk memberi tumpuan kepada penubuhan routing untuk memuatkan komponen lain yang diperlukan. Perubahan yang seolah -olah kecil untuk definisi penghalaan sebenarnya sangat penting untuk keupayaan penghijrahan Angular 2, tetapi ia sama pentingnya dengan Angular 1.5, kerana ia lebih baik merangkumi templat dan pengawal pada tahap komponen.
Angular 1 sebenarnya mempunyai dua modul penghalaan, Ngroute dan NgComponentRouter. Hanya NgComponentRouter yang menyokong komponen, tetapi ia juga tidak ditetapkan. Saya fikir cara terbaik ialah menggunakan UI-Router.
Kebanyakan satu -satunya komponen yang anda bina untuk permohonan anda adalah stateful. Di sini anda sebenarnya akan meletakkan logik perniagaan permohonan, mengeluarkan permintaan HTTP, borang proses, dan tugas -tugas lain yang lain. Komponen ini mungkin unik untuk aplikasi anda, dan mereka memberi tumpuan kepada mengekalkan data dan bukannya rendering visual.
Katakan anda mempunyai pengawal data profil pengguna yang memuatkan untuk paparan, dan terdapat juga templat yang sepadan (tidak ditunjukkan di sini) yang dihubungkan bersama dalam Arahan. Coretan kod ini mungkin merupakan pengawal yang paling asas untuk melakukan tugas itu.
<code>$stateProvider.state('mystate', { url: '/', component: 'mystate' }); </code>
Menggunakan komponen, anda boleh merancangnya lebih baik daripada sebelumnya. Idealnya, anda juga harus menggunakan perkhidmatan ini dan bukannya menggunakan $http
secara langsung dalam pengawal.
<code>.controller('ProfileCtrl', function ($scope, $http) { $http.get('/api/profile').then(function (data) { $scope.profile = data; }); }) .directive('profile', function() { return { templateUrl: 'views/profile.html', controller: 'ProfileCtrl' } }) </code>
Sekarang anda mempunyai komponen yang memuatkan data sendiri, jadi ia menjadi stateful. Jenis -jenis komponen ini adalah serupa dengan komponen penghalaan, kecuali bahawa mereka tidak boleh digunakan untuk menghubungkan ke satu laluan.
Komponen negara akan menggunakan komponen lain (tanpa statik) untuk benar -benar menjadikan UI. Juga, anda masih mahu menggunakan perkhidmatan ini dan bukannya meletakkan logik akses data secara langsung dalam pengawal.
Komponen tanpa kerakyatan memberi tumpuan kepada rendering tanpa menguruskan logik perniagaan dan tidak perlu unik kepada sebarang permohonan tertentu. Sebagai contoh, kebanyakan komponen yang digunakan untuk elemen UI seperti kawalan bentuk, kad, dan lain -lain juga tidak mengendalikan logik seperti memuatkan data atau bentuk penjimatan. Mereka direka untuk menjadi sangat modular, boleh diguna semula dan terpencil.
Jika komponen tanpa stateless memaparkan hanya data atau segala -galanya dalam templat kawalan, pengawal mungkin tidak diperlukan. Mereka akan menerima input daripada komponen yang berkesudahan. Contoh ini mendapat nilai dari komponen negara (contoh profil di atas) dan memaparkan avatar.
<code>.component('profile', { templateUrl: 'views/profile.html', controller: function($http) { var vm = this; // 当组件准备好时调用,见下文 vm.$onInit = function() { $http.get('/api/profile').then(function (data) { vm.profile = data; }); }; } }) </code>
Untuk menggunakannya, komponen yang berkesempatan akan lulus nama pengguna melalui atribut, seperti yang ditunjukkan di bawah: <avatar username="vm.profile.username">.</avatar>
Banyak perpustakaan yang anda gunakan adalah koleksi komponen tanpa stat (dan perkhidmatan yang mungkin). Mereka pasti dapat menerima konfigurasi untuk mengubah suai tingkah laku mereka, tetapi mereka tidak bertujuan untuk bertanggungjawab untuk logik di luar diri mereka.
Ini bukan baru untuk komponen, tetapi biasanya bijak menggunakannya dalam komponen. Tujuan satu arah mengikat adalah untuk mengelakkan memuat lebih banyak kerja ke dalam kitaran pencernaan, yang merupakan faktor utama dalam prestasi aplikasi. Data kini mengalir ke dalam komponen tanpa melihatnya di luarnya (yang membawa kepada beberapa masalah gandingan yang wujud hari ini), dan komponen hanya boleh menyebabkan dirinya berdasarkan input itu. Reka bentuk ini juga berfungsi dengan Angular 2, yang membantu dengan migrasi masa depan.
Dalam contoh ini, atribut tajuk terikat kepada komponen hanya sekali berdasarkan nilai awal yang disediakan. Jika tajuk diubah oleh pelakon luaran, ia tidak akan dapat dilihat dalam komponen. Sintaks yang menunjukkan bahawa pengikatan adalah satu arah adalah menggunakan
<code>> <app>></app>> > </code>
Apabila harta benda berubah, komponen masih akan dikemas kini. Adalah disyorkan bahawa anda menggunakan satu arah mengikat apabila mungkin.
Angular juga mempunyai keupayaan untuk mengikat data dalam satu masa, jadi anda boleh mengoptimumkan kitaran pencernaan. Pada asasnya, sudut akan menunggu untuk memberikan nilai yang tidak ditentukan pertama ke dalam mengikat, mengikat nilai itu, dan kemudian (sekali semua pengikatan telah dihuraikan) Keluarkan pemerhati yang relevan dari kitaran pencernaan. Ini bermakna bahawa pengikatan tertentu tidak menambah masa pemprosesan ke gelung pencernaan masa depan.
Ini dilakukan dengan mendahului ekspresi mengikat dengan ::
. Jika anda tahu bahawa mengikat input tidak akan berubah semasa kitaran hayat, hanya masuk akal untuk berbuat demikian. Dalam contoh ini, jika tajuk itu mengikat satu arah, ia akan terus mengemaskini di dalam komponen, tetapi pengikatan di sini tidak akan dikemas kini kerana kami menentukannya sebagai mengikat satu masa.
<code>$stateProvider.state('mystate', { url: '/', templateUrl: 'views/mystate.html', controller: MyStateController }); </code>
anda mungkin melihat fungsi $onInit
sebagai fungsi baru. Komponen mempunyai hayat dan peristiwa yang sepadan yang perlu anda gunakan untuk membantu menguruskan aspek tertentu komponen.
$onInit()
<code>$stateProvider.state('mystate', { url: '/', component: 'mystate' }); </code>
$postLink()
Langkah seterusnya adalah menghubungkan mana -mana elemen kanak -kanak dalam templat. Apabila komponen dimulakan, tidak ada jaminan bahawa ia juga telah memberikan sebarang elemen kanak -kanak yang digunakan dalam templat. Ini penting jika anda perlu mengendalikan DOM dengan cara apa pun. Satu kaveat penting ialah templat yang tidak disengajakan mungkin tidak dimuatkan apabila peristiwa itu dicetuskan. Anda sentiasa boleh menggunakan penyelesaian cache templat untuk memastikan templat sentiasa tersedia. <code>> <app>></app>> > </code>
$onChanges()
$onChanges
Untuk contoh ini, anggap bahawa komponen disediakan dengan tajuk produk dan keterangan. Anda boleh mengesan perubahan seperti yang ditunjukkan di bawah. Anda boleh melihat objek yang diluluskan kepada fungsi, yang mempunyai objek yang dipetakan ke pengikat yang tersedia, yang mengandungi nilai semasa dan nilai sebelumnya.
<code>$stateProvider.state('mystate', { url: '/', templateUrl: 'views/mystate.html', controller: MyStateController }); </code>
$onDestroy()
Komponen harus mempunyai API yang jelas
<code>$stateProvider.state('mystate', { url: '/', component: 'mystate' }); </code>Untuk mengkonfigurasi dan memulakan komponen dengan satu set data, komponen harus menggunakan pengikatan untuk menerima nilai -nilai ini. Ini kadang -kadang dianggap sebagai API komponen, yang hanya cara yang berbeza untuk menerangkan bagaimana komponen menerima input.
Saya harap anda berfikir
lebih baik. Kadang -kadang pemaju juga suka komponen awalan dan pengikatan sebagai cara untuk mengelakkan konflik nama. Adalah bijak untuk komponen awalan, contohnya<code>.controller('ProfileCtrl', function ($scope, $http) { $http.get('/api/profile').then(function (data) { $scope.profile = data; }); }) .directive('profile', function() { return { templateUrl: 'views/profile.html', controller: 'ProfileCtrl' } }) </code>adalah bar alat bahan, tetapi awalan untuk semua pengikatan boleh menjadi verbose dan harus dielakkan.
symbol
Komponen harus mengeluarkan peristiwa md-toolbar
Peristiwa dalam
boleh digunakan dengan(sehingga ke pokok skop) atau
(turun ke pokok skop). Ini adalah aplikasi praktikal acara sampel yang cepat.
$emit
$broadcast
Terdapat dua situasi utama di mana anda perlu berkomunikasi antara komponen: antara komponen yang anda tahu dan antara komponen yang anda tidak tahu. Untuk menggambarkan perbezaan ini, mari kita anggap kita mempunyai satu set komponen untuk membantu menguruskan tab pada halaman, dan bar alat dengan pautan halaman bantuan yang sepadan.
<code>.component('profile', { templateUrl: 'views/profile.html', controller: function($http) { var vm = this; // 当组件准备好时调用,见下文 vm.$onInit = function() { $http.get('/api/profile').then(function (data) { vm.profile = data; }); }; } }) </code>
Dalam kes ini, komponen
dan<code>.component('avatar', { template: '<img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173975605585460.png" class="lazy" ng- alt="Panduan untuk Membina Komponen Sudut Kualiti 1.5" >', bindings: { username: ' }, controllerAs: 'vm' }) </code>mungkin mengenali satu sama lain kerana mereka bekerjasama untuk membuat satu set tiga tab yang berbeza. Walau bagaimanapun, komponen
berada di luar skop kognitif mereka. my-tabs
Setiap kali tab yang berbeza dipilih (ini akan menjadi peristiwa pada contoh komponen my-tab
), komponen my-tabs
perlu tahu supaya ia dapat menyesuaikan paparan tab untuk memaparkan contoh. Komponen my-tab
boleh mengeluarkan peristiwa ke atas kepada komponen ibu bapa my-tabs
. Komunikasi jenis ini seperti komunikasi dalaman antara dua komponen yang bekerjasama untuk mewujudkan satu fungsi (antara muka tab).
Tetapi bagaimana jika my-toolbar
ingin tahu tab mana yang sedang dipilih supaya ia dapat mengubah butang bantuan berdasarkan kandungan yang dapat dilihat? Acara my-tab
tidak akan mencapai my-toolbar
kerana ia bukan ibu bapa. Jadi pilihan lain adalah menggunakan $rootScope
untuk mengeluarkan peristiwa untuk keseluruhan pokok komponen ke bawah, yang membolehkan mana -mana komponen untuk mendengar dan bertindak balas. Kelemahan yang berpotensi di sini adalah bahawa acara anda kini mencapai setiap pengawal, dan jika komponen lain menggunakan nama acara yang sama, anda boleh mencetuskan kesan yang tidak dijangka.
Tentukan pendekatan mana yang sesuai untuk kes penggunaan anda, tetapi apabila komponen lain mungkin perlu mengetahui tentang acara itu, anda mungkin ingin mengeluarkan acara ke seluruh pokok komponen menggunakan pilihan kedua.
Aplikasi Angular 1 kini boleh ditulis menggunakan komponen, yang mengubah amalan terbaik dan sifat penulisan permohonan kami. Ini adalah untuk lebih baik, tetapi hanya menggunakan komponen tidak semestinya lebih baik daripada yang anda gunakan sebelum ini. Pastikan perkara berikut dalam fikiran apabila membina komponen Angular 1.
$onChanges
Lifecycle untuk melihat perubahan. Adakah anda menggunakan komponen dalam aplikasi angular 1.x anda? Atau, adakah anda akan menunggu sehingga anda beralih ke Angular 2? Saya suka mendengar tentang pengalaman anda dalam komen di bawah.
Komponen Angular 1.5 adalah API yang lebih mudah dan lebih intuitif untuk membuat arahan. Walaupun arahan berkuasa, mereka boleh sukar digunakan kerana fleksibiliti mereka. Sebaliknya, komponen mempunyai konfigurasi yang lebih mudah dan direka untuk digunakan untuk membina elemen UI. Mereka juga memudahkan penggunaan data satu arah yang mengikat dan cangkuk kitaran hayat, yang boleh membawa kepada aliran data yang lebih mudah diramalkan dan debugging yang lebih mudah.
Pengikatan data sehala boleh dicapai menggunakan atribut bindings
dalam komponen Angular 1.5.
Cangkuk kitaran hayat adalah fungsi yang dipanggil pada titik tertentu dalam kitaran hayat komponen. Angular 1.5 memperkenalkan beberapa cangkuk kitaran hidup, seperti $onInit
, $onChanges
, $onDestroy
dan $postLink
. Cangkuk ini boleh digunakan untuk melaksanakan tugas seperti memulakan data, membersihkan sumber, atau membuat reaksi terhadap perubahan yang mengikat.
Komunikasi antara komponen boleh dicapai menggunakan pengikatan dan peristiwa dalam sudut 1.5. Komunikasi ibu bapa ke anak boleh dilakukan dengan menggunakan mengikat, sementara komunikasi anak-ke ibu bapa dapat dilakukan dengan menggunakan peristiwa. Ini memudahkan aliran data sehala, yang boleh menjadikan aplikasi anda lebih mudah difahami.
berpindah dari arahan dalam sudut 1.5 kepada komponen melibatkan beberapa langkah. Pertama, gantikan arahan untuk menentukan objek dengan definisi komponen. Kemudian, gantikan fungsi pautan dengan cangkuk kitaran hayat. Akhirnya, gantikan data dua hala yang mengikat dengan pengikatan data sehala dan peristiwa.
Komponen dalam Angular 1.5 menawarkan beberapa manfaat ke atas arahan. Mereka mempunyai API yang lebih mudah yang memudahkan pengikatan data sehala dan aliran data sehala, dan menyediakan cangkuk kitaran hayat. Ciri -ciri ini boleh menjadikan kod anda lebih mudah difahami, debug, dan mengekalkan.
Transkripsi boleh dicapai dalam komponen Sudut 1.5 menggunakan pilihan transclude
dalam definisi komponen. Ini membolehkan anda memasukkan kandungan tersuai ke dalam templat komponen, yang sangat berguna untuk mewujudkan elemen UI yang boleh diguna semula.
transkripsi multi-slot boleh dilaksanakan dalam komponen sudut 1.5 sudut menggunakan pilihan transclude
dengan sintaks objek. Ini membolehkan anda menentukan pelbagai slot transkripsi dalam templat komponen yang boleh diisi dengan kandungan tersuai.
$onChanges
cangkuk kitaran hayat dalam komponen angular 1.5? Setiap kali mengikat satu arah dikemas kini, cangkuk kitaran hayat $onChanges
dalam komponen Angular 1.5 dipanggil. Ia menerima objek perubahan yang mengandungi nilai semasa dan sebelumnya pengikatan. Ini boleh digunakan untuk membuat reaksi terhadap perubahan yang mengikat dan melaksanakan tugas seperti mengemas kini keadaan komponen atau mendapatkan data.
$postLink
cangkuk kitaran hayat dalam komponen sudut 1.5? Selepas elemen komponen dan unsur -unsur anaknya dikaitkan, cangkuk kitaran $postLink
dalam komponen Sudut 1.5 akan dipanggil. Ini boleh digunakan untuk melaksanakan tugas yang memerlukan akses kepada unsur -unsur DOM komponen, seperti menubuhkan pendengar acara atau mengendalikan DOM.
Atas ialah kandungan terperinci Panduan untuk Membina Komponen Sudut Kualiti 1.5. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!