2013-02-07 11 views
12

Tôi muốn sử dụng tiêm phụ thuộc thích hợp trong MyCtrl1 để tiêm các trường của đối tượng MyCtrl1.resolve. Tôi đã thử nhiều kết hợp khác nhau của việc cố gắng tiêm @MyCtrl1.resolve vv mà không có may mắn.Sự tiêm phụ thuộc vào Angularjs trong giải quyết

@MyCtrl1 = ($scope, $http, batman, title) -> 
    $scope.batman = batman.data 
    $scope.title = title.data 

@MyCtrl1.resolve = { 
batman: ($http) -> 
    $http.get('batman.json') 
title: ($http) -> 
    $http.get('title.json') 
} 
#@MyCtrl1.$inject = ['$scope', '$http'] -- commented out because not sure how to inject resolve fields 

angular 
.module('app', []) 
.config(['$routeProvider', '$locationProvider', ($routeProvider, $locationProvider)-> 
    $locationProvider.html5Mode(true) 

    $routeProvider.when('/', {templateUrl: 'index.html', controller: MyCtrl1, resolve: MyCtrl1.resolve}) 
    $routeProvider.otherwise({redirectTo: '/'}) 
]) 

angular.bootstrap(document,['app']) 

Trả lời

22

Giải quyết là thuộc tính của tuyến đường chứ không phải bộ điều khiển. Bộ điều khiển sẽ được tiêm với các phụ thuộc được xác định trên một mức tuyến, không cần phải xác định các thuộc tính giải quyết trên bộ điều khiển.

Lấy một trong những ví dụ của bạn (chuyển thành JavaScript), bạn sẽ xác định điều khiển của bạn như mọi khi, đó là:

MyCtrl1 = function($scope, $http, batman, title) { 
    $scope.batman = batman.data; 
    $scope.title = title.data; 
} 

và sau đó là quyết tâm sở hữu trên một tuyến đường:

angular.module('app', []).config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) { 
    $locationProvider.html5Mode(true) 

    $routeProvider.when('/',{templateUrl: 'index.html', controller: MyCtrl1, resolve: { 
    batman: ['$http', function($http) { 
     return $http.get(..).then(function(response){ 
     return response.data; 
     }); 
    }], 
    title: ['$http', function($http) { 
     return //as above 
    }] 
    }}); 
    $routeProvider.otherwise({redirectTo: '/'}); 
}]); 

Nếu bạn muốn rút gọn mã bằng cách sử dụng phần giải quyết định tuyến bạn cần sử dụng chú thích kiểu mảng - Tôi đã bao gồm điều này trong ví dụ trên.

+0

Cảm ơn phản hồi của bạn. Tuy nhiên, tôi e rằng tôi không thấy cách này giúp tôi tiêm 'batman' và 'title' vào 'MyCtrl1'. 'MyCtrl1. $ Inject = ['$ scope', '$ http', 'batman', 'title']' sẽ không hoạt động – jakecar

+0

@jakecar nó sẽ hoạt động với các bộ điều khiển được xác định trên toàn cầu. Đối với các bộ điều khiển đăng ký trên một mô-đun (được khuyến nghị), bạn sẽ phải sử dụng các chú thích kiểu mảng. Hãy cho tôi biết nếu bạn có vấn đề khiến nó hoạt động, sẽ chuẩn bị một plunk. –

+3

Tôi nghĩ bạn đang thiếu dấu ngoặc đóng ']' cho 'batman' và' title' –