routeprovider使用resolve将值传递给控制器

时间:2014-07-02 15:41:13

标签: angularjs route-provider

我正在寻找一种从appRoutes向我的控制器传递值的方法。它的想法是调用一个函数并做一些魔术。下面是一些代码,所以你得到一个想法:

appRoutes.js

$routeProvider
  .when('/students/some/path/:id', {
    templateUrl: 'views/studentRecord.html',
    controller:  'StudentsController',
    resolve:     { myVar: 'test' }
  });

studentsCtrl.js

angular.module('StudentsCtrl', [])
  .controller('StudentsController', function($scope, $http, $routeParams,
                                             $location, myVar, Students) {
     /* ... */
   });

理想情况下,我想调用此控制器中的给定函数 - 但解析一个值也同样好。我们的想法是控制器处理与'学生'有关的所有页面并进行一些http调用,这样我的节点服务器就会对mongodb进行一些调用。香港专业教育学院在互联网上尝试了一些变化,没有运气。我收到了一个错误:

  

错误:$ injector:unpr未知提供商

但我不确定如何解决它。

编辑:我现在已经用这个解决了这个问题; http://plnkr.co/edit/mSb58e8cGDNYU27xSizk?p=preview

理想情况下,我想将app.js分成控制器和服务 - 目前正在处理这个问题,对plnkr的任何编辑都会很棒。

问题仍然存在,是否有可能首先在控制器中命中一个函数,而不是通过服务解析一个函数?

2 个答案:

答案 0 :(得分:1)

在每个resolve属性中,您可以使用一个函数让Angular注入服务供您使用:

resolve: {
    myVar1: function(testService) { return testService.fetchList1(); },
    myVar2: function(anotherService, $http) {
        // call service functions to mongo-db or what have you
        return result;
    }
}

然后,您的控制器,只需注入属性:

// myVar1 and myVar2 are now here
app.controller('StudentsController', function($scope, myVar1, myVar2) {
    /* ... */
});

如果resolve内的函数返回的值是promise,那么它将在调用控制器代码之前解析(因此,名称为resolve)。这实际上是推荐的方法,因为它使服务代码(例如testService)可以在许多控制器中重用。

答案 1 :(得分:0)

传递一个返回值

的函数
.state('tab2', {
                url: '/tab2',
                templateUrl: 'templates/tab2.html',
                controller: 'Tab2Controller as tab2Ctrl',
                //promise
                resolve: {
                    lastName: function  () { return 'makarov'}
                }
            });

然后在控制器中

function Tab2Controller(lastName) {
    console.log("Tab2", lastName);
}