Beyannamemin foo
herhangi bir yerinden arayabileceğim bir yardımcı programım varsa ng-app
. Modül kurulumumda global olarak erişebileceğim bir yol var mı veya her denetleyicideki kapsama eklemem gerekiyor mu?
Beyannamemin foo
herhangi bir yerinden arayabileceğim bir yardımcı programım varsa ng-app
. Modül kurulumumda global olarak erişebileceğim bir yol var mı veya her denetleyicideki kapsama eklemem gerekiyor mu?
Yanıtlar:
Temel olarak iki seçeneğiniz vardır, ya bir hizmet olarak tanımlayın ya da kök kapsamınıza yerleştirin. Kök kapsamını kirletmemek için bir hizmet vermenizi öneririm. Bir hizmet oluşturursunuz ve bunu denetleyicinizde şu şekilde kullanılabilir hale getirirsiniz:
<!doctype html>
<html ng-app="myApp">
<head>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="http://code.angularjs.org/1.1.2/angular.min.js"></script>
<script type="text/javascript">
var myApp = angular.module('myApp', []);
myApp.factory('myService', function() {
return {
foo: function() {
alert("I'm foo!");
}
};
});
myApp.controller('MainCtrl', ['$scope', 'myService', function($scope, myService) {
$scope.callFoo = function() {
myService.foo();
}
}]);
</script>
</head>
<body ng-controller="MainCtrl">
<button ng-click="callFoo()">Call foo</button>
</body>
</html>
Bu sizin için bir seçenek değilse, bunu kök kapsamına şu şekilde ekleyebilirsiniz:
<!doctype html>
<html ng-app="myApp">
<head>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="http://code.angularjs.org/1.1.2/angular.min.js"></script>
<script type="text/javascript">
var myApp = angular.module('myApp', []);
myApp.run(function($rootScope) {
$rootScope.globalFoo = function() {
alert("I'm global foo!");
};
});
myApp.controller('MainCtrl', ['$scope', function($scope){
}]);
</script>
</head>
<body ng-controller="MainCtrl">
<button ng-click="globalFoo()">Call global foo</button>
</body>
</html>
Bu şekilde, tüm globalFoo()
şablonlarınız denetleyiciden şablona aktarmak zorunda kalmadan çağrı yapabilir.
foo()
fonksiyon varsa ne olur ? $scope.callFoo()
Her biri için bir sargı yapmak çok fazla iş. Şablonda kullanılabilmesi için bir kütüphanenin tüm işlevlerini kapsama nasıl ekleyebilirim ? Şablonumda kullanılabilir olmasını istediğim büyük bir birim dönüştürme kitaplığım var.
$scope.callFoo = myService.foo;
kullanmak istediğiniz her yerde yeni bir sarıcı oluşturmak yerine söyleyerek "ekleyebilirsiniz" .
Bunları da birleştirebilirsiniz sanırım:
<!doctype html>
<html ng-app="myApp">
<head>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="http://code.angularjs.org/1.1.2/angular.min.js"></script>
<script type="text/javascript">
var myApp = angular.module('myApp', []);
myApp.factory('myService', function() {
return {
foo: function() {
alert("I'm foo!");
}
};
});
myApp.run(function($rootScope, myService) {
$rootScope.appData = myService;
});
myApp.controller('MainCtrl', ['$scope', function($scope){
}]);
</script>
</head>
<body ng-controller="MainCtrl">
<button ng-click="appData.foo()">Call foo</button>
</body>
</html>
$rootScope
?
İlk yaklaşım 'açısal benzeri' yaklaşım olarak savunulsa da, bunun ek yük getirdiğini hissediyorum.
Bu myservice.foo işlevini 10 farklı denetleyicide kullanmak isteyip istemediğimi düşünün. Bu 'myService' bağımlılığını ve sonra on tanesinde $ scope.callFoo scope özelliğini belirtmem gerekecek. Bu sadece bir tekrarlamadır ve bir şekilde KURU ilkesini ihlal eder.
Oysa, $ rootScope yaklaşımını kullanırsam, bu global işlevi gobalFoo'yu yalnızca bir kez belirtirim ve kaç tane olursa olsun, gelecekteki tüm denetleyicilerimde kullanılabilir olacaktır.
AngularJs sadece sizin gibi sorunlar için " Hizmetler " ve " Fabrikalar " vardır. Bunlar Kontrolörler, Direktifler, Diğer Hizmetler veya diğer herhangi bir açısaljs bileşenleri arasında küresel bir şey için kullanılır .. Fonksiyonları tanımlayabilir, veri saklayabilir, hesaplama fonksiyonları yapabilir veya her neyse içeride istediğiniz Hizmetleri ve onları olduğu gibi angularjs Bileşenlerinin kullandığımız Küresel .like
angular.module('MyModule', [...])
.service('MyService', ['$http', function($http){
return {
users: [...],
getUserFriends: function(userId){
return $http({
method: 'GET',
url: '/api/user/friends/' + userId
});
}
....
}
}])
daha fazlasına ihtiyacınız varsa
Neden AngularJs Hizmetlerine ve Fabrikalarına İhtiyacımız Olduğu Hakkında Daha Fazla Bilgi
Açısal için biraz daha yeniyim ama yararlı bulduğum (ve oldukça basit), yine de tüm sayfalarda erişmem gereken küresel değişkenlerle yerel komut dosyasından önce sayfama yüklediğim global bir komut dosyası oluşturdum. Bu komut dosyasında, "globalFunctions" adlı bir nesne oluşturdum ve global olarak özellikler olarak erişmem gereken işlevleri ekledim. örn globalFunctions.foo = myFunc();
. Sonra, her yerel komut dosyasında yazdım $scope.globalFunctions = globalFunctions;
ve global komut dosyasında globalFunctions nesnesine eklediğim herhangi bir işleve anında erişebiliyorum.
Bu biraz geçici bir çözümdür ve size yardımcı olduğundan emin değilim ama birçok fonksiyonum olduğu için kesinlikle bana yardımcı oldu ve her sayfaya hepsini ekleyen bir acıydı.
module.value('myFunc', function(a){return a;});
ve sonra denetleyicilerinize ada göre enjekte edebilirsiniz. (Bir hizmet yapmaktan kaçınmak istiyorsa)