Çok sayıda değerli kaynak sayesinde, AngularJS uygulamalarında bileşenlerin uygulanması için bazı genel önerilerim var:
Kontrolör
Denetleyici, model ve görünüm arasında yalnızca bir ara katman olmalıdır . Mümkün olduğunca ince yapmaya çalışın .
Denetleyicide iş mantığından kaçınılması şiddetle tavsiye edilir. Modele taşınmalıdır.
Denetleyici, yöntem çağırma (çocuklar ebeveyn ile iletişim kurmak istediğinde mümkündür) veya $ emit , $ yayın ve $ on yöntemlerini kullanarak diğer denetleyicilerle iletişim kurabilir . Yayılan ve yayınlanan mesajlar minimumda tutulmalıdır.
Denetleyici, sunum veya DOM manipülasyonunu önemsememelidir .
Yuvalanmış denetleyicilerden kaçınmaya çalışın . Bu durumda, ebeveyn denetleyici model olarak yorumlanır. Modelleri bunun yerine paylaşılan hizmetler olarak enjekte edin.
Kapsam denetleyicisi için kullanılmalıdır bağlama görüntüsü modeli ve
kapsülleyici gör Model gibi sunum modeli tasarım modeli.
Dürbün
Kapsamı şablonlarda salt okunur ve denetleyicilerde salt yazılır olarak ele alın . Kapsamın amacı, model olmak değil, modele atıfta bulunmaktır.
Çift yönlü bağlama (ng-modeli) yaparken, doğrudan osiloskop özelliklerine bağlanmadığınızdan emin olun.
Modeli
Angularjs içinde Modeli olan tekil tarafından tanımlanan hizmet .
Model, verileri ayırmak ve görüntülemek için mükemmel bir yol sağlar.
Modeller, tipik olarak tam olarak bir bağımlılığa (bir tür olay yayıcı, ortak durumda $ rootScope ) sahip oldukları ve yüksek düzeyde test edilebilir alan mantığı içerdikleri için birim testi için birincil adaylardır .
Model, belirli bir birimin uygulaması olarak düşünülmelidir. Tek sorumluluk ilkesine dayanmaktadır. Birim, gerçek dünyada tek bir varlığı temsil edebilen ve onu veri ve durum açısından programlama dünyasında tanımlayabilen kendi kapsamından sorumlu bir örnektir .
Model, uygulamanızın verilerini sarmalamalı
ve bu verilere erişmek ve bunları değiştirmek için bir API sağlamalıdır .
Model, benzer uygulamalara kolaylıkla taşınabilmesi için taşınabilir olmalıdır .
Modelinizde birim mantığını izole ederek, bulmayı, güncellemeyi ve bakımını kolaylaştırdınız.
Model, tüm uygulama için ortak olan daha genel küresel modellerin yöntemlerini kullanabilir.
Bileşenlerin birleştirilmesini azaltmaya ve birim test edilebilirliğini ve kullanılabilirliğini artırmaya gerçekten bağımlı değilse, bağımlılık enjeksiyonu kullanarak modelinize diğer modellerin bileşiminden kaçınmaya çalışın .
Modellerde olay dinleyicilerini kullanmaktan kaçının. Test etmeyi zorlaştırır ve genellikle tek sorumluluk ilkesi açısından modelleri öldürür.
Model Uygulaması
Model, veri ve durum açısından bir miktar mantığı içermesi gerektiğinden, üyelerine erişimi mimari olarak kısıtlamalıdır, böylece gevşek bağlantıyı garanti edebiliriz.
Bunu AngularJS uygulamasında yapmanın yolu, fabrika hizmet türünü kullanarak tanımlamaktır . Bu, özel mülkleri ve yöntemleri çok kolay bir şekilde tanımlamamıza ve ayrıca genel olarak erişilebilir olanları, geliştirici için gerçekten okunabilir hale getirecek şekilde tek bir yerde geri döndürmemize olanak tanır.
Bir örnek :
angular.module('search')
.factory( 'searchModel', ['searchResource', function (searchResource) {
var itemsPerPage = 10,
currentPage = 1,
totalPages = 0,
allLoaded = false,
searchQuery;
function init(params) {
itemsPerPage = params.itemsPerPage || itemsPerPage;
searchQuery = params.substring || searchQuery;
}
function findItems(page, queryParams) {
searchQuery = queryParams.substring || searchQuery;
return searchResource.fetch(searchQuery, page, itemsPerPage).then( function (results) {
totalPages = results.totalPages;
currentPage = results.currentPage;
allLoaded = totalPages <= currentPage;
return results.list
});
}
function findNext() {
return findItems(currentPage + 1);
}
function isAllLoaded() {
return allLoaded;
}
return {
init: init,
find: findItems,
allLoaded: isAllLoaded,
findNext: findNext
};
});
Yeni örnekler oluşturma
Bağımlılık enjeksiyonunu bozmaya başladığından ve kütüphane, özellikle üçüncü şahıslar için tuhaf davranacağından, yeni bir yetenekli işlev döndüren bir fabrikaya sahip olmaktan kaçının.
Aynı şeyi başarmanın daha iyi bir yolu, fabrikayı, alıcı ve ayarlayıcı yöntemleri eklenmiş bir nesne koleksiyonunu döndürmek için bir API olarak kullanmaktır.
angular.module('car')
.factory( 'carModel', ['carResource', function (carResource) {
function Car(data) {
angular.extend(this, data);
}
Car.prototype = {
save: function () {
var carData =
return carResource.save(carData);
}
};
function getCarById ( id ) {
return carResource.getById(id).then(function (data) {
return new Car(data);
});
}
return {
findById: getCarById
};
});
Global Model
Genel olarak bu tür durumlardan kaçınmaya çalışın ve modellerinizi doğru şekilde tasarlayın, böylece kontrolöre enjekte edilebilir ve sizin görüşünüzde kullanılabilir.
Özel durumda, bazı yöntemler uygulama içinde küresel erişilebilirliği gerektirir. Bunu mümkün kılmak için $ rootScope içinde ' common ' özelliği tanımlayabilir ve uygulama önyüklemesi sırasında bunu commonModel'e bağlayabilirsiniz :
angular.module('app', ['app.common'])
.config(...)
.run(['$rootScope', 'commonModel', function ($rootScope, commonModel) {
$rootScope.common = 'commonModel';
}]);
Tüm küresel yöntemleriniz ' ortak ' mülk içinde yaşayacaktır . Bu bir tür ad alanıdır .
Ancak doğrudan $ rootScope'unuzda herhangi bir yöntem tanımlamayın . Bu, görüş kapsamınız dahilinde ngModel yönergesi ile birlikte kullanıldığında beklenmedik davranışlara yol açabilir , genellikle kapsamınızı bozar ve kapsam yöntemlerinin sorunları geçersiz kılmasına yol açar.
Kaynak
Kaynak, farklı veri kaynaklarıyla etkileşim kurmanıza olanak tanır .
Tek sorumluluk ilkesi kullanılarak uygulanmalıdır .
Özel durumda , HTTP / JSON uç noktaları için yeniden kullanılabilir bir proxy'dir.
Kaynaklar modellere enjekte edilir ve veri gönderme / alma imkanı sağlar.
Kaynak uygulaması
RESTful sunucu tarafı veri kaynaklarıyla etkileşim kurmanıza izin veren bir kaynak nesnesi oluşturan bir fabrika.
Döndürülen kaynak nesnesi, düşük seviyeli $ http hizmetiyle etkileşime girmeye gerek kalmadan yüksek düzeyde davranışlar sağlayan eylem yöntemlerine sahiptir.
Hizmetler
Hem model hem de kaynak hizmetlerdir .
Hizmetler, birbiriyle ilişkili olmayan, gevşek bir şekilde bağlı işlevsellik birimleridir.
Hizmetler, Angular'ın, hizmetlerin uzun süredir yaygın olarak kullanıldığı sunucu tarafından istemci tarafı web uygulamalarına getirdiği bir özelliktir.
Angular uygulamalarındaki hizmetler, bağımlılık ekleme kullanılarak birbirine bağlanan değiştirilebilir nesnelerdir.
Angular, farklı hizmet türleriyle birlikte gelir. Her birinin kendi kullanım durumları vardır. Ayrıntılar için lütfen Hizmet Türlerini Anlama bölümünü okuyun .
Uygulamanızda servis mimarisinin ana prensiplerini göz önünde bulundurmaya çalışın .
Genel olarak Web Hizmetleri Sözlüğü'ne göre :
Bir hizmet, sağlayıcıların ve talep edenlerin bakış açısından uyumlu bir işlevsellik oluşturan görevleri gerçekleştirme yeteneğini temsil eden soyut bir kaynaktır. Kullanılabilmesi için, bir hizmet somut bir sağlayıcı acentesi tarafından gerçekleştirilmelidir.
İstemci tarafı yapısı
Genelde uygulamanın istemci tarafı modüllere ayrılmıştır . Her modül bir birim olarak test edilebilir olmalıdır .
Modülleri türe göre değil , özellik / işlev veya görünüme göre tanımlamaya çalışın . Ayrıntılar için Misko'nun sunumuna bakın.
Modül bileşenleri, geleneksel olarak denetleyiciler, modeller, görünümler, filtreler, yönergeler vb. Türlere göre gruplandırılabilir.
Ancak modülün kendisi yeniden kullanılabilir , aktarılabilir ve test edilebilir olmaya devam ediyor .
Ayrıca geliştiricilerin kodun bazı bölümlerini ve tüm bağımlılıklarını bulması çok daha kolaydır.
Ayrıntılar için lütfen Büyük AngularJS ve JavaScript Uygulamalarında Kod Organizasyonuna bakın .
Klasör yapılandırmasına bir örnek :
|-- src/
| |-- app/
| | |-- app.js
| | |-- home/
| | | |-- home.js
| | | |-- homeCtrl.js
| | | |-- home.spec.js
| | | |-- home.tpl.html
| | | |-- home.less
| | |-- user/
| | | |-- user.js
| | | |-- userCtrl.js
| | | |-- userModel.js
| | | |-- userResource.js
| | | |-- user.spec.js
| | | |-- user.tpl.html
| | | |-- user.less
| | | |-- create/
| | | | |-- create.js
| | | | |-- createCtrl.js
| | | | |-- create.tpl.html
| |-- common/
| | |-- authentication/
| | | |-- authentication.js
| | | |-- authenticationModel.js
| | | |-- authenticationService.js
| |-- assets/
| | |-- images/
| | | |-- logo.png
| | | |-- user/
| | | | |-- user-icon.png
| | | | |-- user-default-avatar.png
| |-- index.html
Açısal uygulama yapılanma dair iyi bir örnek tarafından uygulanan açısal uygulama içi - https://github.com/angular-app/angular-app/tree/master/client/src
Bu aynı zamanda modern uygulama oluşturucuları tarafından da dikkate alınır - https://github.com/yeoman/generator-angular/issues/109