3
Takeaways Key
Lihat model di AngularJs boleh mempunyai keadaan pelanggan sahaja, seperti 'animasi-permulaan' dan 'animasi-berakhir' atau 'diseret' dan 'jatuh'. Negeri ini boleh diuruskan apabila membuat dan menyimpan model View menggunakan perkhidmatan sumber $ Angular.
perkhidmatan sumber $
mari kita mulakan dengan menarik sumber artikel kami ke dalam perkhidmatan suntikan. Mari kita juga menambah keadaan yang paling remeh ke atas apabila artikel pertama kali dibuat.
angular<span>.module('clientOnlyState.controllers') </span> <span>.controller('ArticleCtrl', function($scope, $resource, ArticleStates /* simple lookup */) { </span> <span>var Article = $resource('/article/:articleId', { articleId: '@id' }); </span> <span>var article = new Article({ id: 1, title: 'A title', author: 'M Godfrey' }); </span> article<span>.state = ArticleStates.NONE; // "NONE" </span> $scope<span>.article = article; </span> $scope<span>.save = function() { </span> article<span>.state = ArticleStates.SAVING; // "SAVING" </span> article<span>.$save(function success() { </span> article<span>.state = ArticleStates.SAVED; // "SAVED" </span> <span>}); </span> <span>}; </span> <span>});</span>
bagaimana dengan pengambilan dan penjimatan? Kami mahu artikel muncul kepada pengguna sebagai perkhidmatan sumber $, jadi ia mesti secara konsisten berfungsi seperti satu. Teknik yang saya pelajari dalam buku "Rahsia Ninja JavaScript" John Resig sangat berguna di sini - pembungkus fungsi. Inilah pelaksanaannya secara langsung diangkat ke dalam perkhidmatan sudut suntikan.
Ini membolehkan kita membungkus kaedah menyimpan dan mendapatkan artikel dan melakukan sesuatu yang berbeza/tambahan sebelum dan selepas:
angular<span>.module('clientOnlyState.services') </span> <span>.factory('Article', function($resource<span>, ArticleStates</span>) { </span> <span>var Article = $resource('/article/:articleId', { articleId: '@id' }); </span> <span>// Consumers will think they're getting an Article instance, and eventually they are... </span> <span>return function(data) { </span> <span>var article = new Article(data); </span> article<span>.state = ArticleStates.NONE; </span> <span>return article; </span> <span>} </span> <span>});</span>
Pengawal kami mula menjadi lebih leaner kerana ini dan tidak menyedari bagaimana keadaannya ditetapkan. Ini bagus, kerana pengawal tidak boleh peduli sama ada.
angular<span>.module('clientOnlyState.controllers') </span> <span>.controller('ArticleCtrl', function($scope, $resource, ArticleStates /* simple lookup */) { </span> <span>var Article = $resource('/article/:articleId', { articleId: '@id' }); </span> <span>var article = new Article({ id: 1, title: 'A title', author: 'M Godfrey' }); </span> article<span>.state = ArticleStates.NONE; // "NONE" </span> $scope<span>.article = article; </span> $scope<span>.save = function() { </span> article<span>.state = ArticleStates.SAVING; // "SAVING" </span> article<span>.$save(function success() { </span> article<span>.state = ArticleStates.SAVED; // "SAVED" </span> <span>}); </span> <span>}; </span> <span>});</span>
kami telah pergi ke tahap yang munasabah untuk merangkum perubahan keadaan di luar pengawal kami, tetapi apa manfaat yang kami perolehi?
Pengawal kami kini boleh menggunakan pendengar menonton yang diluluskan negeri lama dan baru untuk menetapkan mesej. Ia juga boleh melakukan terjemahan tempatan, seperti yang ditunjukkan di bawah.
angular<span>.module('clientOnlyState.services') </span> <span>.factory('Article', function($resource<span>, ArticleStates</span>) { </span> <span>var Article = $resource('/article/:articleId', { articleId: '@id' }); </span> <span>// Consumers will think they're getting an Article instance, and eventually they are... </span> <span>return function(data) { </span> <span>var article = new Article(data); </span> article<span>.state = ArticleStates.NONE; </span> <span>return article; </span> <span>} </span> <span>});</span>
Pertimbangkan seketika bahawa $ skop, arahan dan penapis membentuk API permohonan. Pandangan HTML Menggunakan API ini. Semakin besar komposit API semakin besar potensi untuk digunakan semula. Bolehkah penapis meningkatkan komposiliti ke atas menonton baru berbanding lama?
sesuatu seperti berikut adalah apa yang saya fikirkan. Setiap bahagian ungkapan menjadi diguna semula.
angular<span>.module('clientOnlyState.services') </span> <span>.factory('wrapMethod', function() { </span> <span>return function(object<span>, method, wrapper</span>) { </span> <span>var fn = object[method]; </span> <span>return object[method] = function() { </span> <span>return wrapper.apply(this, [fn.bind(this)].concat( </span> <span>Array.prototype.slice.call(arguments)) </span> <span>); </span> <span>}; </span> <span>} </span> <span>});</span>
Sehubungan dengan sudut 1.3, penapis boleh menggunakan harta yang dikenakan $, tetapi penggunaannya sangat tidak digalakkan kerana sudut tidak dapat cache hasil memanggil penapis berdasarkan nilai parameter input. Oleh itu, kita akan lulus dalam parameter negara untuk limittotransition (keadaan terdahulu) dan diterjemahkan (terjemahan yang tersedia).
angular<span>.module('clientOnlyState.services') </span> <span>.factory('Article', function($resource<span>, ArticleStates, wrapMethod</span>) { </span> <span>var Article = $resource('/article/:articleId', { articleId: '@id' }); </span> <span>wrapMethod(Article, 'get', function(original<span>, params</span>) { </span> <span>var article = original(params); </span> article<span>.$promise.then(function(article) { </span> article<span>.state = ArticleStates.NONE; </span> <span>}); </span> <span>return article; </span> <span>}); </span> <span>// Consumers will actually call $save with optional params, success and error arguments </span> <span>// $save consolidates arguments and then calls our wrapper, additionally passing the Resource instance </span> <span>wrapMethod(Article, 'save', function(original<span>, params, article, success, error</span>) { </span> article<span>.state = ArticleStates.SAVING; </span> <span>return original.call(this, params, article, function (article) { </span> article<span>.state = ArticleStates.SAVED; </span> success <span>&& success(article); </span> <span>}, function(article) { </span> article<span>.state = ArticleStates.ERROR; </span> error <span>&& error(article); </span> <span>}); </span> <span>}); </span> <span>// $resource(...) returns a function that also has methods </span> <span>// As such we reference Article's own properties via extend </span> <span>// Which in the case of get and save are already wrapped functions </span> <span>return angular.extend(function(data) { </span> <span>var article = new Article(data); </span> article<span>.state = ArticleStates.NONE; </span> <span>return article; </span> <span>}, Article); </span> <span>});</span>
Kerana ini kita memerlukan sedikit pindaan kepada artikel:
angular<span>.module('clientOnlyState.controllers') </span> <span>.controller('ArticleCtrl', function($scope<span>, Article</span>) { </span> <span>var article = new Article({ id: 1, title: 'A title', author: 'M Godfrey' }); </span> <span>console.log(article.state); // "NONE" </span> $scope<span>.article = article; </span> $scope<span>.save = function() { </span> article<span>.$save({}, function success() { </span> <span>console.log(article.state); // "SAVED" </span> <span>}, function error() { </span> <span>console.log(article.state); // "ERROR" </span> <span>}); </span> <span>}; </span> <span>});</span>
Hasil akhirnya tidak begitu cantik tetapi masih sangat kuat:
angular<span>.module('clientOnlyState.controllers') </span> <span>.controller('ArticleCtrl', function($scope<span>, Article, ArticleStates</span>) { </span> <span>var article = new Article({ id: 1, title: 'A title', author: 'M Godfrey' }); </span> <span>var translations = {}; </span> translations<span>[ArticleStates.SAVED] = 'Saved, oh yeah!'; </span> translations<span>['default'] = ''; </span> $scope<span>.article = article; </span> $scope<span>.save = function() { </span> article<span>.$save({}); </span> <span>}; </span> $scope<span>.$watch('article.state', function(newState<span>, oldState</span>) { </span> <span>if (newState == ArticleStates.SAVED && oldState == ArticleStates.SAVING) { </span> $scope<span>.message = translations[newState]; </span> <span>} else { </span> $scope<span>.message = translations['default']; </span> <span>} </span> <span>}); </span> <span>});</span>
Pengawal kami menjadi lebih leaner lagi, terutamanya jika anda menganggap terjemahan dapat ditarik ke dalam perkhidmatan suntikan:
<span><span><span><p</span>></span>{{article.state | limitToTransition:"SAVING":"SAVED" | translate}}<span><span></p</span>></span></span>
Mengekstrak model paparan ke dalam perkhidmatan suntikan membantu kami skala aplikasi. Contoh yang diberikan dalam jawatan ini sengaja mudah. Pertimbangkan aplikasi yang membolehkan perdagangan pasangan mata wang (mis. GBP ke USD, EUR ke GBP dan lain -lain). Setiap pasangan mata wang mewakili produk. Dalam permohonan sedemikian terdapat beratus-ratus produk, dengan setiap menerima kemas kini harga masa nyata. Kemas kini harga mungkin lebih tinggi atau lebih rendah daripada harga semasa. Salah satu bahagian permohonan itu mungkin mengambil berat tentang harga yang lebih tinggi dua kali berturut -turut, sementara bahagian lain mungkin mengambil berat tentang harga yang baru saja turun. Mampu menonton perubahan harga ini dengan memudahkan pelbagai bahagian yang memakan aplikasi.
Saya membentangkan kaedah alternatif untuk menonton berdasarkan nilai lama dan baru, penapisan. Kedua -duanya adalah teknik yang boleh diterima sepenuhnya - sebenarnya menonton adalah apa yang saya fikirkan ketika saya mula meneliti jawatan ini. Penapisan adalah peningkatan yang berpotensi yang dikenal pasti berhampiran penyempurnaan pos.
Saya ingin melihat sama ada teknik yang saya telah membentangkan membantu anda skala aplikasi sudut. Mana -mana dan semua maklum balas akan banyak diterima dalam komen!
sampel kod yang dibuat semasa meneliti siaran ini juga boleh didapati di GitHub.
Atas ialah kandungan terperinci Menguruskan keadaan pelanggan sahaja di AngularJS. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!