2013-02-07 20 views
12

Ich würde gerne die richtige Abhängigkeitsinjektion in MyCtrl1 verwenden, um die Felder des MyCtrl1.resolve Objekts zu injizieren. Ich habe viele verschiedene Kombinationen versucht, @MyCtrl1.resolve etc. ohne Glück zu injizieren.Angularjs Abhängigkeitsinjektion in Auflösung

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

Antwort

22

Resolve ist eine Eigenschaft einer Route und kein Controller. Controller würden Abhängigkeiten injiziert, die auf einer Routenebene definiert sind. Es ist nicht erforderlich, Auflösungseigenschaften auf einem Controller anzugeben.

Unter einem Ihrer Beispiele (JavaScript umgewandelt), würden Sie Ihren Controller definieren, wie immer, das heißt:

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

und dann die resolve-Eigenschaft auf einer Route:

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

Wenn Wenn Sie den Code mithilfe des Abschnitts "Auflösen" des Routings minimieren möchten, müssen Sie Annotationen im Array-Stil verwenden. Dies ist im obigen Beispiel enthalten.

+0

Vielen Dank für Ihre Antwort. Ich fürchte allerdings nicht, dass mir das hilft, "Batman" und "Titel" in "MyCtrl1" zu injizieren. 'MyCtrl1. $ Inject = ['$ scope', '$ http', 'batman', 'title']' würde nicht funktionieren – jakecar

+0

@jakecar sollte es für global definierte Controller funktionieren. Für die Controller, die auf einem Modul registriert sind (empfohlen), müssten Sie Array-artige Annotationen verwenden. Lassen Sie mich wissen, wenn Sie Probleme haben, damit es funktioniert, bereiten Sie einen Plunk vor. –

+3

Ich denke, dass Sie die schließende Klammer ']' für 'batman' und' title' –

Verwandte Themen