作者:6毛群--yuki | 来源:互联网 | 2023-05-19 13:22
使用ui.router,我们有一个状态控制器:
controller('widget', function($repository, $stateParams){
$scope.widget = $repository.get($stateParams.id);
})
注册时间:
.state('widget',
controller: 'widget',
template: '/widgetTemplate.html'
我们遇到了一个案例,我们希望将此控制器作为模板的一部分重用:
但似乎没有一种简单的方法可以使用正确的ID注入模拟的$ stateParams对象.就像是:
除了编写增强ng-controller或重构我们的代码以使用继承范围的自定义指令之外,是否有任何开箱即用的方法可以做到这一点?
1> New Dev..:
我不相信有一种现成的方式。ng-controller
仅使用常规控制器实例化,就没有机会注入任何东西。
但这是一个有趣的“功能”,实际上,可以使用自定义指令相对简单地对其进行构建。
这是一个说明性的示例(免责声明:绝对不会在晦涩的场景下进行测试):
.directive("ngInject", function($parse, $interpolate, $controller, $compile) {
return {
terminal: true,
transclude: true,
priority: 510,
link: function(scope, element, attrs, ctrls, transclude) {
if (!attrs.ngController) {
element.removeAttr("ng-inject");
$compile(element)(scope);
return;
}
var cOntrollerName= attrs.ngController;
var newScope = scope.$new(false);
var locals = $parse(attrs.ngInject)(scope);
locals.$scope = newScope;
var cOntroller= $controller(controllerName, locals);
element.data("ngControllerController", controller);
element.removeAttr("ng-inject").removeAttr("ng-controller");
$compile(element)(newScope);
transclude(newScope, function(clone){
element.append(clone);
});
// restore to hide tracks
element.attr("ng-controller", controllerName);
}
};
});
用法如您所描述:
而且,当然,控制器可以注入以下变量:
.controller("SecondCtrl", function($scope, foo, bar){
});
矮人