2013-10-14 23 views
34

Một tân binh-ish rất câu hỏi:Làm cách nào để chuyển các tham số khi sử dụng dịch vụ tài nguyên?

Tôi đang cố gắng để xây dựng đối tượng tài nguyên sử dụng phương pháp nhà máy:

.factory('Magazines', [function ($resource) { 

    var url = document.URL; 
    var urlArray = url.split("/"); 
    var organId = urlArray[urlArray.length-1]; 

    return $resource('http://localhost/ci/api/magazines/:id', { 
     loginID : organEntity, 
     password : organCommpassword, 
     id : organId 
    }); 
    }]) 

Phương pháp này rất dễ dàng vì tất cả params là được xác định trước, organEntity và organCommpassword được định nghĩa bên trong thẻ.

Bây giờ đối với một đối tượng tài nguyên khác, tôi cần chuyển tham số khi nhà máy được gọi.

Tôi tưởng tượng mã gọi của đối tượng khu vực này sẽ giống như thế:

.controller('ResrouceCtrl', function($scope, Magazines) { 
     $scope.magazines = Magazines.query(); 
}); 

Tôi biết truy vấn() phương pháp có thể thêm các thông số: Magazines.query(params, successcb, errorcb);

Tôi tự hỏi nếu tôi chỉ vượt qua trong các thông số, có thể tôi lấy thông số tại nhà máy? Làm thế nào để chỉ định như vậy thông qua trong các tham số trong phương pháp nhà máy?

Ví dụ: bây giờ giả sử tôi không thể lấy organId từ url nữa, tôi cần chuyển nó từ bộ điều khiển của mình, cách nhận organId trong phương thức nhà máy?


Đây là js tài nguyên của tôi:

.factory('MagComments', function ($resource) { 


    return $resource('http://localhost/dooleystand/ci/api/magCommenct/:id', { 
     loginID : organEntity, 
     password : organCommpassword, 
     id : '@magId' //pass in param using @ syntax 
    }); 
    }) 

Đây là bộ điều khiển của tôi:

$scope.magComments = MagComments.query({magId : 1}); 

tôi đã cố gắng để vượt qua trong tham số, nhưng nó gây ra một lỗi

+0

Tôi hơi bối rối về những gì bạn đang làm một số mã khác có thể hữu ích. Tại sao nó lại quan trọng khi bạn lấy OrganId từ đâu? Tôi sẽ chuyển giá trị vào.query() phương thức khi controller gọi nó mặc dù, như bạn đã nói rồi. Nhà máy chỉ được gọi một lần trong ứng dụng của bạn, vì vậy "Tạp chí" là một singleton. –

+0

Vì vậy, tôi chỉ có thể vượt qua trong các thông số từ bộ điều khiển của tôi thông qua .query() và chỉ cần sử dụng nó trong nhà máy? –

+0

Tôi không nghĩ bạn rõ ràng về những gì nhà máy làm. Nhà máy tạo ra một đối tượng được truyền cho bộ điều khiển của bạn khi bạn chỉ định nó phụ thuộc vào "Tạp chí" trong hàm xây dựng. Vì vậy, tài nguyên mà bạn đã trả về * là * Tạp chí trong bộ điều khiển của bạn và nó hoạt động giống như tài liệu cho biết. Hoặc là bạn nói rằng bạn muốn sử dụng mặc định khác nhau cho một bộ điều khiển cụ thể mà tôi có thể chỉ cho bạn nhưng tôi sẽ nghĩ rằng chỉ cần gọi truy vấn với "params" nên làm việc tốt cho tình hình của bạn. –

Trả lời

45

Tôi nghĩ rằng tôi nhìn thấy bạn vấn đề, bạn cần phải sử dụng cú pháp @ để xác định các thông số bạn sẽ chuyển theo cách này, tôi cũng không chắc chắn ID hoặc mật khẩu nào đang làm bạn dường như không định nghĩa chúng ở bất kỳ đâu và chúng không được sử dụng làm tham số URL họ có phải là sen không t như tham số truy vấn?

Đây là những gì tôi có thể đề nghị dựa trên những gì tôi nhìn thấy cho đến nay:

.factory('MagComments', function ($resource) { 
    return $resource('http://localhost/dooleystand/ci/api/magCommenct/:id', { 
     loginID : organEntity, 
     password : organCommpassword, 
     id : '@magId' 
    }); 
    }) 

Chuỗi @magId sẽ nói với các nguồn tài nguyên để thay thế :id với tài sản magId trên đối tượng bạn vượt qua nó như là tham số.

Tôi khuyên bạn nên đọc hơn the documentation here (Tôi biết nó hơi đục) rất cẩn thận và xem các ví dụ về phía cuối, điều này sẽ giúp ích rất nhiều.

+0

Haha, đừng lo lắng về tên đăng nhập và mật khẩu đó. Chúng được xác định trong '' trong HTML. Cảm ơn bạn! Tôi sẽ đọc kỹ tài liệu hơn! –

+0

Vì vậy, chúng là các biến toàn cầu hoặc một cái gì đó? –

8

tôi đề nghị bạn sử dụng provider. Cung cấp là tốt khi bạn muốn cấu hình nó lần đầu tiên trước khi sử dụng (đối với dịch vụ/Factory)

Cái gì như:

.provider('Magazines', function() { 

    this.url = '/'; 
    this.urlArray = '/'; 
    this.organId = 'Default'; 

    this.$get = function() { 
     var url = this.url; 
     var urlArray = this.urlArray; 
     var organId = this.organId; 

     return { 
      invoke: function() { 
       return ...... 
      } 
     } 
    }; 

    this.setUrl = function(url) { 
     this.url = url; 
    }; 

    this.setUrlArray = function(urlArray) { 
     this.urlArray = urlArray; 
    }; 

    this.setOrganId = function(organId) { 
     this.organId = organId; 
    }; 
}); 

.config(function(MagazinesProvider){ 
    MagazinesProvider.setUrl('...'); 
    MagazinesProvider.setUrlArray('...'); 
    MagazinesProvider.setOrganId('...'); 
}); 

Và bây giờ điều khiển:

function MyCtrl($scope, Magazines) {   

     Magazines.invoke(); 

     .... 

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