ถ้าฉันมีฟังก์ชั่นยูทิลิตี้foo
ที่ฉันต้องการที่จะสามารถโทรจากที่ใดก็ได้ภายในng-app
ประกาศของฉัน มีบางอย่างที่ฉันสามารถทำให้สามารถเข้าถึงได้ทั่วโลกในการตั้งค่าโมดูลของฉันหรือฉันจำเป็นต้องเพิ่มมันเข้าไปในขอบเขตในทุก ๆ คอนโทรลเลอร์?
ถ้าฉันมีฟังก์ชั่นยูทิลิตี้foo
ที่ฉันต้องการที่จะสามารถโทรจากที่ใดก็ได้ภายในng-app
ประกาศของฉัน มีบางอย่างที่ฉันสามารถทำให้สามารถเข้าถึงได้ทั่วโลกในการตั้งค่าโมดูลของฉันหรือฉันจำเป็นต้องเพิ่มมันเข้าไปในขอบเขตในทุก ๆ คอนโทรลเลอร์?
คำตอบ:
โดยทั่วไปคุณมีสองตัวเลือกไม่ว่าจะเป็นบริการหรือวางไว้ในขอบเขตรากของคุณ ฉันขอแนะนำให้คุณให้บริการจากมันเพื่อหลีกเลี่ยงมลภาวะขอบเขตรูต คุณสร้างบริการและทำให้มันพร้อมใช้งานในคอนโทรลเลอร์ของคุณดังนี้:
<!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>
หากนั่นไม่ใช่ตัวเลือกสำหรับคุณคุณสามารถเพิ่มลงในขอบเขตรูทดังนี้:
<!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>
ด้วยวิธีนี้แม่แบบทั้งหมดของคุณสามารถโทรได้globalFoo()
โดยไม่ต้องผ่านมันไปยังแม่แบบจากตัวควบคุม
foo()
ฟังก์ชันมากมาย การทำ$scope.callFoo()
เสื้อคลุมสำหรับทุกคนนั้นเป็นงานที่มากเกินไป ฉันจะ"แนบ"ฟังก์ชั่นทั้งหมดของห้องสมุดในขอบเขตเพื่อให้สามารถใช้ในแม่แบบได้อย่างไร ฉันมีไลบรารีการแปลงหน่วยขนาดใหญ่ที่ฉันต้องการให้มีอยู่ในเทมเพลตของฉัน
$scope.callFoo = myService.foo;
แทนการสร้าง wrapper ใหม่ในแต่ละที่ที่คุณต้องการใช้
คุณสามารถรวมเข้าด้วยกันฉันเดาว่า:
<!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
?
แม้ว่าวิธีการแรกจะได้รับการสนับสนุนในฐานะ 'เชิงมุมคล้าย' แต่ฉันรู้สึกว่านี่จะเพิ่มค่าใช้จ่าย
พิจารณาว่าฉันต้องการใช้ฟังก์ชั่น myservice.foo นี้ในคอนโทรลเลอร์ 10 ตัวที่แตกต่างกันหรือไม่ ฉันจะต้องระบุการพึ่งพา 'myService' นี้จากนั้น $ scope.callFoo คุณสมบัติขอบเขตในทั้งสิบรายการ นี่เป็นเพียงการกล่าวซ้ำ ๆ และเป็นการละเมิดหลักการ DRY
ในขณะที่ถ้าฉันใช้วิธี $ rootScope ฉันจะระบุฟังก์ชั่นทั่วโลกนี้ gobalFoo เพียงครั้งเดียวและมันจะมีอยู่ในตัวควบคุมในอนาคตของฉันทั้งหมดไม่ว่าจะมีจำนวนเท่าใด
AngularJs มี " บริการ " และ " โรงงาน " เพียงสำหรับปัญหาเช่นคุณของคุณเหล่านี้จะใช้ในการมีบางสิ่งบางอย่างทั่วโลกระหว่างตัวควบคุมคำสั่งบริการอื่น ๆ หรือส่วนประกอบเชิงมุมอื่น ๆ .. คุณสามารถกำหนดฟังก์ชั่นจัดเก็บข้อมูล ต้องการภายในบริการและใช้ใน AngularJs Components เป็นGlobal. like
angular.module('MyModule', [...])
.service('MyService', ['$http', function($http){
return {
users: [...],
getUserFriends: function(userId){
return $http({
method: 'GET',
url: '/api/user/friends/' + userId
});
}
....
}
}])
ถ้าคุณต้องการมากขึ้น
ค้นหาข้อมูลเพิ่มเติมเกี่ยวกับสาเหตุที่เราต้องการบริการและโรงงานของ AngularJs
ฉันค่อนข้างใหม่กับ Angular แต่สิ่งที่ฉันพบว่ามีประโยชน์ในการทำ (และค่อนข้างง่าย) คือฉันสร้างสคริปต์สากลที่ฉันโหลดลงบนหน้าเว็บของฉันก่อนหน้าสคริปต์ท้องถิ่นที่มีตัวแปรทั่วโลกที่ฉันต้องการเข้าถึงในทุกหน้า ในสคริปต์นั้นฉันสร้างวัตถุที่เรียกว่า "globalFunctions" และเพิ่มฟังก์ชั่นที่ฉันต้องการในการเข้าถึงทั่วโลกเป็นคุณสมบัติ globalFunctions.foo = myFunc();
เช่น จากนั้นในแต่ละสคริปต์ท้องถิ่นฉันเขียน$scope.globalFunctions = globalFunctions;
และฉันสามารถเข้าถึงฟังก์ชั่นใด ๆ ที่ฉันเพิ่มไปยังวัตถุ globalFunctions ในสคริปต์สากลได้ทันที
นี่เป็นวิธีแก้ปัญหาเล็กน้อยและฉันไม่แน่ใจว่ามันจะช่วยคุณได้ แต่มันช่วยฉันได้แน่นอนเพราะฉันมีฟังก์ชั่นมากมายและมันก็เป็นความเจ็บปวดที่เพิ่มพวกเขาทั้งหมดในแต่ละหน้า
module.value('myFunc', function(a){return a;});
จากนั้นฉีดชื่อลงในคอนโทรลเลอร์ของคุณ (หากใครต้องการหลีกเลี่ยงการให้บริการ)