我正在寻找一种从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的任何编辑都会很棒。
问题仍然存在,是否有可能首先在控制器中命中一个函数,而不是通过服务解析一个函数?
答案 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);
}