2012-09-30 48 views
12

Tôi muốn sử dụng tài liệu $ để lấy giá trị máy chủ từ trường nhập.Nhà cung cấp/dịch vụ nào có sẵn trong module.config?

var base_url = $document[0].getElementById('BaseUrl').value; 

Url cơ sở được sử dụng để lấy mẫu.

var base_url = $document[0].getElementById('BaseUrl').value; 

$routeProvider.when('/alert', { 
    controller: function() { }, 
    templateUrl: base_url + '/partials/instances.html' 
}); 

Vì tài liệu $ ném lỗi mà tôi không biết là tôi không có cấu hình? Có cách nào để tìm ra cái gì có sẵn và cái gì không? Tôi cũng có thể sử dụng $ http để lấy dữ liệu từ máy chủ nhưng điều đó cũng không có sẵn.

+0

Nhìn vào câu trả lời này: http://stackoverflow.com/questions/17011616/using-a-relative-path-for-a-service-call-in-angularjs/17112017#17112017 Tôi nghĩ rằng đó là một giải pháp tốt hơn. –

Trả lời

16

AngularJS module được bootstrapped trong 2 giai đoạn:

  • Configuration phase nơi duy nhất cung cấp dịch vụ và hằng có sẵn.
  • Run phase nơi dịch vụ được khởi tạo dựa trên nhà cung cấp đã đăng ký. Trong các hằng số pha này vẫn có sẵn nhưng không có nhà cung cấp.

Các AngularJS documentation (phần: "Mô-đun tải & Dependencies") cho cái nhìn sâu sắc này:

Module là một tập hợp các cấu hình và chạy các khối mà có được áp dụng cho các ứng dụng trong quá trình khởi động. Trong của nó đơn giản nhất hình thành các mô-đun bao gồm bộ sưu tập của hai loại khối:

Cấu hình khối - được thực hiện trong thời gian đăng ký cung cấp dịch vụ và giai đoạn cấu hình. Chỉ các nhà cung cấp và hằng số mới có thể được tiêm vào các khối cấu hình. Điều này nhằm ngăn chặn sự khởi tạo ngẫu nhiên các dịch vụ trước khi chúng được cấu hình đầy đủ.

Chạy các khối - nhận được thực hiện sau khi bộ phun được tạo và được sử dụng để khởi động ứng dụng . Chỉ các cá thể và hằng số mới có thể được tiêm vào các khối chạy. Điều này nhằm ngăn cấu hình hệ thống hơn trong thời gian chạy ứng dụng .

Với điều trên, bạn chỉ có thể tiêm các hằng số và nhà cung cấp (được đánh dấu bằng hậu tố Provider trong tài liệu API). Điều này có thể trả lời câu hỏi của bạn nhưng không giúp giải quyết vấn đề tải mẫu của bạn ...

Tôi tự hỏi nếu bạn không thể đơn giản sử dụng thẻ cơ sở trong HTML và sau đó chỉ cần sử dụng đường dẫn tương đối (cơ sở) mà không xác định đường dẫn tuyệt đối?Sth tương tự (với điều kiện cơ sở được cấu hình đúng):

$routeProvider.when('/alert', { 
    controller: function() { }, 
    templateUrl: 'partials/instances.html' 
}); 
+0

Tôi đoán tôi sẽ đi với giải pháp đường dẫn tương đối. Có lý do tôi không muốn sử dụng nhưng nó có lẽ là giải pháp tốt nhất. – Pickels

16

Mặc dù câu hỏi đã thường được trả lời, đây là một chút Ngoài nhắm mục tiêu các ví dụ cụ thể được sử dụng trong câu hỏi:

Làm thế nào để sử dụng một hằng số góc để xác định baseUrl của partials của bạn (hoặc để xác định hằng số khác đại diện cho các giá trị máy chủ và làm cho chúng có sẵn cho cấu hình):

// file: app.js 
'use strict'; 

/* App Module */ 
angular.module('myApp', []) 

    // define the templateBaseUrl 
    .constant('templateBaseUrl', 'themes/angular/partials/'); 

    // use it in configuration 
    .config(['$routeProvider','templateBaseUrl', function($routeProvider,templateBaseUrl) { 
    $routeProvider 
     .when('/posts', { 
     templateUrl : templateBaseUrl + 'post-list.html', 
     controller : PostListCtrl 
     }) 
     .when('/posts/:postId-:slug', { 
     templateUrl : templateBaseUrl + 'post-view.html', 
     controller : PostViewCtrl 
     }) 
     .when('/about', { 
     templateUrl : templateBaseUrl + 'about.html', 
     controller : AboutPageCtrl 
     }) 
     .when('/contact', { 
     templateUrl : templateBaseUrl + 'contact.html', 
     controller : ContactPageCtrl 
     }) 
     .otherwise({ 
     redirectTo: '/posts' 
     }) 
    ; 
    }]); 

Theo tôi, điều này có một số lợi ích:

  • Nếu bạn di chuyển quan điểm của bạn, bạn chỉ cần cập nhật mã của bạn trong một địa điểm duy nhất
  • Nếu partials của bạn được lồng nhau sâu sắc trong cách bố trí dự án của bạn, "templateBaseUrl" không gây ra càng nhiều tiếng ồn như toàn bộ con đường sẽ
  • Bạn thậm chí có thể thay đổi giữa đường dẫn tương đối và tuyệt đối
  • An answer to a similar question đề xuất sử dụng phần tử cơ sở của html để loại bỏ nhu cầu thêm baseUrl vào mỗi mẫuUrl. Nhưng điều này cũng ảnh hưởng đến tất cả các tài nguyên khác trên trang web. Chỉ định cấu hình url cơ sở cho các mẫu không có tác dụng phụ

Nói chung, tôi không sử dụng giải pháp này với giá trị mã hóa cứng như trên. Nó chỉ là một ví dụ để hiển thị những gì phải làm theo cách đơn giản nhất. Để có thể sao chép ứng dụng của bạn xung quanh trên máy chủ của bạn, xác định giá trị bên ngoài của app.js, trong tập tin chỉ mục của bạn và tạo ra cần thiết bên pathes server:

// file: index.php 
<?php 
    // only depends on your project layout 
    $angularPartialsBaseUrl = 'themes/angular/partials/'; 
    // this will change when you move the app around on the server 
    $themeBaseUrl = $_SERVER['REQUEST_URI'] . 'themes/angular'; 
?><!DOCTYPE html> 
<html ng-app="myApp"> 
<head> 
    <title>Yii Blog Demo</title> 

    <script> 
     var myNS = myNS || {}; 
     myNS.appConfig = myNS.appConfig || {}; 
     myNS.appConfig.templateBaseUrl = '<?php echo $angularPartialsBaseUrl; ?>'; 
    </script> 

    <script src="<?php echo $themeBaseUrl; ?>/js/vendor/angular/angular.js"></script> 
    <script src="<?php echo $themeBaseUrl; ?>/js/app.js"></script> 

</head> 

[...] 

Và trong app.js:

// file: app.js 
'use strict'; 

/* App Module */ 
angular.module('myApp', []) 

    // define the templateBaseUrl using external appConfig 
    .constant('templateBaseUrl', myNS.appConfig.templateBaseUrl); 
Các vấn đề liên quan