2013-02-20 26 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; 
    }] 
};