我通过$ controller创建了一个控制器并注入了一些值,我希望我可以通过控制器中的$ injector.get获取它,但是失败了。
$controller(controllerFunc, {name: 'ron'})
var controllerFunc = function($injector){
$injector.get('name'); // failed here
};
有人可以帮我解决这个问题,谢谢。
罗恩
实际上,我面临的问题是我想在两种情况下共享控制器,一种是在ui-bootstrap模式窗口中,另一种是在正常路由中。有关详细信息,请参阅以下内容:
angular.module('app', [])
.controller('editUser', function($scope, $modalInstance) {
// ...
})
对于名为'editUser'的控制器,我可以在$ modal.open中使用它,但它对普通路由不起作用。所以我原来的尝试是
angular.module('app', [])
.controller('editUser', function($scope, $injector) {
var $modalInstance;
// the following doesn't work for the scenario of $modal.open
if ($injector.has('$modalInstance')) {
$modalInstance = $injector.get('$modalInstance');
}
})
答案 0 :(得分:2)
$modalInstance
仅适用于为自己打开的$modal
上使用的控制器。它更像是resolved
依赖项,就像我们在$route
上看到的那样。
要获得它,您需要在angular.controller()
声明中注释:
angular.controller('Users', ['$modalInstance', function (inst) {
console.log(inst); // Will log the entire object of the current modalInstace
});
我故意更改了函数参数,因为在注释依赖项时它的名称并不重要。顺便说一句,这是声明依赖注入以避免缩小重命名问题的正确方法。
因此,由于您希望在$route
和$modal
两种情况下使用相同的控制器,因此您需要注意$modalInstance
上的$route
未定义{1}}控制器使用。
您有一些指导原则:
1 - 在几个地方使用相同代码的过程中处理将出现的未定义代码;
2 - 使用它下面的范围函数开发控制器代码,作为参数接收您需要的依赖项;
3 - 不要让所有上下文处理特定依赖项的特定代码;
然而 1 :我建议您建立一个可以处理上下文之间的常见任务并将其作为服务注入特定控制器的类。
然而 2 :构建一个单独的函数/类,当你使用它们时,它将成为上下文的控制器并创建它的new
个实例,{{1每种情况的依赖关系:
$inject
在function Controller () {
/* Your dependencies */
var args = Array.prototype.slice.call(arguments),
deps = {};
if (!!this.$inject && this.$inject.length) {
this.$inject.map(function (item, index) {
deps[item] = args[index];
});
}
/* /Your dependencies */
this.methodA = function methodA () {
/* Common Code */
};
this.methodB = function methodB () {
/* Common Code */
};
}
配置:
$routeProvider
在$routeProvider.when('/users/:user', {
controler: function () {
var output = new Controller();
ouput.$inject = ['depA', 'depB', 'depC'];
return output;
},
controllerAs: 'users',
template: '<div id="exampleTemplate" ng-bind="users.anyProperty"></div>"
});
来电(即使在同一$modal
内):
Controller()
如果应用了,您将能够在/* Other "Controller" function Code... */
this.methodB = function methodB () {
deps.$modal.open({
controler: function () {
var output = new Controller();
ouput.$inject = ['depA', 'depB', '$modalInstance'];
return output;
},
controllerAs: 'usersModal'
});
};
/* /Other "Controller" function Code... */
内部声明一个使用Controller()
的函数:
$modalInstance
让我知道它是否适合你。
答案 1 :(得分:1)
你误解了这个概念。 myController
定义控制器的构造函数。提供商参数,如 $ injector ,将自动注入,但自定义参数为 param1 , param2 和 $ scope 必须提供给构造函数。使用$injector
,您可以获得在启动时注册的任何对象/服务 - 但不是本地参数。
希望这有帮助。
angular.module('app', [])
.run(function($controller, $rootScope) {
var myController = function($scope, $injector, param1, param2) {
console.log(param1);
console.log(param2);
console.log($injector);
console.log($injector.get('$http'));
}
var locals = {
'$scope': $rootScope.$new(),
'param1': 'value1',
'param2': 'value2'
};
var ctrl = $controller(myController, locals);
});