2012-07-04 37 views
37

Làm cách nào để tạo một số loại gói utils có thể truy cập được từ tất cả các bộ điều khiển của tôi?Tạo các chức năng điều khiển chung

tôi có mã tuyến đường này trong mô-đun chính của tôi:

'use strict'; 

angular.module('lpConnect', []). 
    config(['$routeProvider', function($routeProvider) { 
    $routeProvider. 
     when('/home', {template: 'views/home.html', controller: HomeCtrl}). 
     when('/admin', {template: 'views/admin.html', controller: AdminCtrl}). 
     when('/connect', {template: 'views/fb_connect.html', controller: MainAppCtrl}). 
     otherwise({redirectTo: '/connect'}); 
}]); 

Tôi muốn có một chức năng có thể được phổ biến để HomeCtrl, AdminCtrlMainAppCtrl.

Tôi nên làm như thế nào trong AngularJS?

Trả lời

61

Cách xác định mã chung trong góc là thông qua Dịch vụ.

Bạn sẽ xác định một dịch vụ mới như vậy:

.factory('CommonCode', function ($window) { 
     var root = {}; 
     root.show = function(msg){ 
      $window.alert(msg); 
     }; 
     return root; 
    }); 

Trong điều khiển của bạn, bạn sẽ bơm service..like này để

function MainAppCtrl($scope,CommonCode) 
{ 
    $scope.alerter = CommonCode; 
    $scope.alerter.show("Hello World"); 
} 

Chỉ cần bao gồm CommonCode như một cuộc tranh cãi với chức năng điều khiển của bạn. Góc sẽ chăm sóc tiêm nó cho bạn (Đọc trên Dependancy Injection ..để hiểu những gì đang xảy ra ở đây.)

+6

Bất cứ ai khác tìm nó .... odd mà bạn định nghĩa một dịch vụ bằng cách gọi phương thức factory? Có vẻ như một số cải tiến đặt tên sẽ đi một chặng đường dài để tăng khả năng tiếp cận của khuôn khổ. – bclinkinbeard

+0

@bclinkinbeard chính xác suy nghĩ của tôi khi tôi quấn đầu quanh AngularJS. 'factory()', 'value()', 'constant()', và 'service()' có vẻ không nhiều hơn các phím tắt cho các trường hợp cụ thể 'cung cấp()', được dự định sẽ được sử dụng để xác định (Cung cấp các dịch vụ. Tôi đoán các tài liệu sẽ được hưởng lợi từ một yêu cầu kéo đặt câu trên vào các chữ cái lớn ở đâu đó. – Tony

+0

Thành thật mà nói, khi tôi lần đầu tiên bắt đầu, điều này làm tôi bối rối. Factory() thường trả về một singleton, như bạn có thể thấy, từ ví dụ trên. Một dịch vụ() - trả về một hàm tạo. Một giá trị() và hằng số() theo như tôi có thể nói thường làm điều tương tự. Và tất cả những điều này là wrapper (tiện lợi) trên cung cấp() ... – ganaraj

7

Chỉ cần cập nhật câu trả lời trước đó (mà chỉ xác định factory là gì), có 3 cách để inject dependencies (xác định mã phổ biến) trong AngularJS:

  • Providers
  • nhà máy
  • Dịch vụ

Tôi sẽ không nói nhiều về cung cấp dịch vụ vì nó là một phương pháp mất thời gian hơn để tiêm phụ thuộc. Tuy nhiên, this page giải thích rất rõ cách thức hoạt động của chúng.


Về mặt kỹ thuật, dịch vụ nhà máy được sử dụng để điều tương tự. Nó quay ra, một dịch vụ là một hàm xây dựng trong khi một nhà máy thì không.

Từ this post:

module.service('serviceName', function); 

Khi tuyên bố serviceName như một cuộc tranh cãi tiêm bạn sẽ được cung cấp với một thể hiện của hàm.

module.factory('factoryName', function); 

Khi tuyên bố factoryName như một cuộc tranh cãi tiêm bạn sẽ được cung cấp với giá trị được trả về bằng cách gọi các chức năng tham khảo qua để module.factory.


Bạn có thể sử dụng một trong những bạn thích và có được cùng kết quả.

Dưới đây là hai mã làm chính xác những điều tương tự thông qua service đầu tiên, và sau đó factory:

cú pháp dịch vụ

app.service('MyService', function() { 
    this.sayHello = function() { 
    console.log('hello'); 
    }; 
}); 
cú pháp

Factory

app.factory('MyService', function() { 
    return { 
    sayHello: function() { 
     console.log('hello'); 
    } 
    } 
}); 
Các vấn đề liên quan