2013-02-20 56 views
20

我的寫作角度控制器的風格是這樣的(使用控制器的名稱,而不是功能)Angularjs帶控制器解決的字符串

angular.module('mymodule', [ 
]) 
    .controller('myController', [ 
     '$scope', 
     function($scope) { 
      // Some code here 

     } 
    ]); 

我現在需要提供我時的路線我想定義解決部分:

$routeProvider.when('/someroute', { 
     templateUrl: 'partials/someroute.html', 
     resolve: myController.resolve}) // THIS IS THE CRITICAL LINE 

由於控制器被定義爲一個名稱如何完成解析部分的波紋管?

澄清更多細節我想在解析路由之前從服務器加載一些數據,然後將這些數據用於控制器。

更新:更確切地說,我希望每個模塊都有它的「解析」功能,該功能將在執行該控制器之前在根目錄之前調用。 this post(由Misko Hevery回答)的解決方案正是我想要的,但我沒有將控制器作爲功能,而是作爲名稱。

回答

23

控制器定義和解析部分應在路徑定義中單獨指定。

如果你需要引用它們作爲字符串模塊級定義控制器,所以:

$routeProvider.when('/someroute', { 
     templateUrl: 'partials/someroute.html', 
     controller: 'myController', 
     resolve: { 
      myVar: function(){ 
      //code to be executed before route change goes here 
      }; 
     }); 

上面的代碼也顯示瞭如何定義一組將路由改變之前解決變量。當解決了這些變量可以被注入到一個控制器,以便採取從片斷上面的例子中,你會寫你的控制器像這樣:

.controller('myController', ['$scope', 'myVar', function($scope, myVar) { 
      // myVar is already resolved and injected here 
     } 
    ]); 

該視頻可能有所幫助:http://www.youtube.com/watch?v=P6KITGRQujQ

+0

我可以使用的服務,也? – 2013-02-21 12:19:22

+0

@AndrejKaurin你可以注入服務給你的控制器和解決功能,如果這是你問的問題...你能更精確嗎? – 2013-02-21 12:27:01

+0

我更新了我的問題,以便更加精確。 – 2013-02-21 14:00:55

14

@ pkozlowski.opensource「我的回答很有用,但我並不想搞亂我的路由和控制器,因爲我總是保持它與Y發生器分離。實際上,我們也可以將控制器和解析(r)全部設爲string /名稱(不是功能)。

angular.module('mymodule', [ 
]) 
    .controller('myController', [ 
     '$scope', 'myModelCombination' 
     function($scope, myModelCombination) { 
      // myModelCombination[0] === (resolved) myModel 
      // myModelCombination[1] === (resolved) myModel2 

     } 
    ]) 
    .controller('myController2', [ 
     '$scope', 'myModel' 
     function($scope, myModel) { 
      // Some code here 

     } 
    ]) 
    .factory('myModel', [ 
     '$scope', 
     function($scope) { 
      // return a promise 

     } 
    ]) 
    .factory('myModel2', [ 
     '$scope', 
     function($scope) { 
      // return a promise 

     } 
    ]) 
    .factory('myModelCombination', [ 
     '$scope', 'myModel', 'myModel2' 
     function($scope) { 
      return $q.all(['myModel', 'myModel2']); 

     } 
    ]); 

然後在你的路由文件本應加入

$routeProvider.when('/someroute', { 
    templateUrl: 'partials/someroute.html', 
    resolve: ['myModel'] //ALWAYS IN ARRAY) 
}); 
$routeProvider.when('/myModelCombination', { 
    templateUrl: 'partials/someroute2.html', 
    resolve: ['myModel'] //ALWAYS IN ARRAY) 
}); 

http://docs.angularjs.org/api/ng。$ routeProvider

+2

myModel工廠應該回諾?那麼如何通過單個工廠返回更多的承諾(在這種情況下是myModel)?或者我應該爲每一個決心創造新的工廠。 – 2013-08-12 22:59:00

+1

是的,除非您希望等待所有內容並將所有內容全部返回到$ q.all()中,否則每個工廠都應返回一個且唯一的一件事,無論是價值還是承諾。回答編輯。 – TruongSinh 2014-01-19 19:54:54

+0

這似乎並不奏效。你可以演一個小提琴嗎? – sh0ber 2017-05-17 23:31:13

0

@TruongSinh答案爲我工作比在路由器具有附加功能的方式更好。我稍微調整了它,因爲它返回的是延遲對象而不是實際解析的數據。

$routeProvider.when('/someroute', { 
    templateUrl: 'partials/someroute.html', 
    controller: 'SomeController', 
    resolve: { 
     myModel: 'myModel' 
    } 
}); 
+3

是否可以在此發佈整個解決方案?我正在嘗試做同樣的事情(在解析時返回一個延遲對象)並且難以使其工作。謝謝。 – Pinny 2014-08-09 03:56:35

0

這工作太

var MyController = myApp.controller('MyController', ['$scope', 'myData', function($scope, myData) { 
    // Some code here 
}]); 

MyController.resolve = { 
    myData: ['$http', '$q', function($http, $q) { 
    var defer = $q.defer(); 

    $http.get('/foo/bar') 
     .success(function(data) { 
     defer.resolve(data); 
     }) 
     .error(function(error, status) { 
     defer.reject(error); 
     }); 

    return defer.promise; 
    }] 
};