2

我正在寻找一种将值从我的 appRoutes 传递给我的控制器的方法。有了它调用函数并做一些魔术的想法。继承人一些代码,所以你有一个想法:

appRoutes.js

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

学生Ctrl.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 的任何编辑都会很棒。

问题仍然存在,是否可以先在控制器中使用一个功能,而不是通过服务解决一个?

4

2 回答 2

2

在每个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) {
    /* ... */
});

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

于 2014-07-02T16:46:09.410 回答
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);
}
于 2016-12-20T08:10:00.433 回答