2013-02-07 160 views
12

我想在MyCtrl1中使用適當的依賴注入來注入MyCtrl1.resolve對象的字段。我試過很多不同的組合,試圖注入@MyCtrl1.resolve等,但沒有運氣。Angularjs依賴注入的解析

@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']) 

回答

22

解決方法是路由而不是控制器的屬性。控制器將被注入在路由級別上定義的依賴項,不需要在控制器上指定解析屬性。

以你的例子之一(轉換爲JavaScript),您將定義控制器一如既往,那就是:

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

,然後路線上的resolve屬性:

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: '/'}); 
}]); 

如果你想使用路由的解析部分來縮小代碼,你需要使用數組樣式的註釋 - 我已經在上面的例子中包含了這個。

+0

感謝您的回覆。但是,恐怕我不明白這是如何幫助我將「蝙蝠俠」和「標題」注入到「MyCtrl1」中的。 'MyCtrl1。$ inject = ['$ scope','$ http','batman','title']'不起作用 – jakecar

+0

@jakecar它應該適用於全局定義的控制器。對於在模塊上註冊的控制器(推薦),您將不得不使用數組樣式註釋。讓我知道如果你有問題使其工作,將準備一個龐然大物。 –

+3

我認爲你錯過了'batman'和'title'的右括號']' –