2013-08-30 66 views
6

Tôi đã đọc qua các công thức sau đây, trong đó cho thấy một cách để tăng sức mạnh một frontend AngularJS với Google Cloud thiết bị đầu cuối backend:Sự khác nhau giữa init() và window.init() là gì?

https://cloud.google.com/resources/articles/angularjs-cloud-endpoints-recipe-for-building-modern-web-applications

Những gì tôi không hiểu phụ lục trên AngularJS và điểm cuối đám mây là khởi tạo. Các phần có liên quan như sau:

Phụ lục: Lời khuyên về AngularJS + điểm cuối đám mây khởi Mẹo # 1: Hãy cẩn thận về trình tự khởi

các lưu bút tải ứng dụng ba thư viện JS khác nhau trong trình tự sau :

  • AngularJS
  • ứng dụng lưu bút
  • Google API Client, whi ch chứa các thiết bị đầu cuối chức năng

Để thực hiện theo trình tự này, index.html chứa <script> thẻ sau trong thẻ <head> cho tải mỗi thư viện JS:

<script src="js/angular.min.js"></script> 
<script src="js/guestbook.js"></script> 
<script src="https://apis.google.com/js/client.js?onload=init"></script> 

Sau khi load, thứ ba thư viện (Ứng dụng khách API của Google) gọi hàm khởi tạo được chỉ định bởi tham số 'onload' của nó. Trong trường hợp này, hàm init() được mong đợi và được gọi. Mẹo # 2: Nhập vào các AngularJS thế giới càng nhanh càng tốt

Trong chuỗi khởi tạo, chúng tôi sử dụng hai chức năng:

init() function 
window.init() function 

init này() chức năng được định nghĩa trong guestbook.js trong những điều sau đây cách:

function init() { window.init(); } 

Như bạn có thể thấy đoạn mã trên, chức năng chỉ cần gọi window.init) chức năng (tức là init() chức năng được xác định trong đối tượng cửa sổ toàn cầu) ( và không có gì khác. Các window.init() được định nghĩa trong AngularJS điều khiển như sau:

$window.init= function() { 
    $scope.$apply($scope.load_guestbook_lib); 
}; 

Trong AngularJS, các đối tượng cửa sổ toàn cầu được truy cập bởi “$ sổ” ký hiệu mà là một wrapper cho nó. Đó là cách thực hành tốt nhất trong AngularJS không truy cập trực tiếp vào đối tượng cửa sổ để cải thiện khả năng kiểm tra.

Lý do tại sao bạn không muốn thực thi khởi tạo trong phương thức init() đầu tiên() để bạn có thể đặt nhiều mã nhất có thể vào thế giới AngularJS, chẳng hạn như bộ điều khiển, dịch vụ và chỉ thị. Kết quả là bạn có thể khai thác toàn bộ sức mạnh của AngularJS và có tất cả các bài kiểm tra đơn vị, bài kiểm tra tích hợp, v.v.

Dường như chức năng toàn cầu init() đang được xác định trong tệp javascript bên ngoài.Hàm init() này chỉ cần gọi window.init() (và được cho là được gọi bởi thư viện máy khách của Google sau khi nó đã được tải). Nhưng không phải window.init() không có gì ngoài chức năng init() được định nghĩa toàn cầu? Vì vậy, chúng ta sẽ không nhận được một vòng lặp ở đây cho đến khi window.init() (và do đó init()) đang được định nghĩa lại?

+1

Xin don không dựa vào tài nguyên ngoài trang web. Hiển thị mã bạn đang nói đến. Ngắt nguồn tài nguyên ngoài trang web và mọi người không cần phải truy cập tài nguyên để giúp bạn. –

Trả lời

0

guestbook.js xác định hàm init xuất hiện từ mô tả của bạn thành toàn cầu. Hàm init đó được chuyển tới google client.js. Hàm init toàn cục này chỉ gọi hàm global (khác) tại window.init. Mô-đun góc được nạp đầu tiên phải có window.init thiết lập thông qua góc được cung cấp cửa sổ $. Không có vòng lặp, client.js gọi init của guestbook.js gọi phương thức góc $ window.init, giống như window.init.

+0

Tôi không hoàn toàn hiểu: Một hàm được xác định trên toàn cầu hiển thị dưới dạng thuộc tính trên đối tượng chung, đó là cửa sổ. Vậy làm thế nào có thể có hai hàm init và window.init khác nhau? (Vì vậy, với sự hiểu biết của tôi, hoặc guestbook.js sẽ ghi đè lên phiên bản Angular-defined hoặc ngược lại.) – Marc

1

Ví dụ này cố gắng thực hiện sự kiện init api của Google và chuyển nó tới phạm vi AngularJS.

Khi

<script src="https://apis.google.com/js/client.js?onload=init"></script> 

được nạp nó gọi hàm init định nghĩa toàn cầu, do đó gọi phương thức init xác định trên đối tượng cửa sổ. Kể từ khi chức năng này có quyền truy cập vào các phạm vi góc, nó đóng tốt với góc

Nó làm cho nó dễ dàng hơn để bọc các cuộc gọi đám mây điểm cuối trong lời hứa

Dưới đây là làm thế nào để làm cho nó dễ dàng hơn nhiều http://anandsekar.github.io/initialize-google-appengine-and-angularjs/

+0

Hàm init được định nghĩa trên toàn cầu là phương thức init được định nghĩa trên đối tượng cửa sổ. Vì vậy, tôi không thấy lý do tại sao mã sẽ không lặp lại. – Marc

Các vấn đề liên quan