gpt4 book ai didi

angularjs - 使用 ng-controller 注入(inject)所需的依赖项

转载 作者:行者123 更新时间:2023-12-04 18:05:41 24 4
gpt4 key购买 nike

使用 ui.router,我们有一个状态 Controller :

controller('widget', function($repository, $stateParams){
$scope.widget = $repository.get($stateParams.id);
})

注册:
.state('widget',
controller: 'widget',
template: '/widgetTemplate.html'

我们遇到了一个案例,我们喜欢将此 Controller 作为模板的一部分重用:
<div ng-controller="widget" ng-include="/widgetTemplate.html"></div>

但似乎没有一种简单的方法来注入(inject)具有正确 ID 的模拟 $stateParams 对象。就像是:
<div ng-controller="widget" ng-inject="{$stateParams: {id: 1234}}" ng-include="/widgetTemplate.html"></div>

除了编写增强 ng-controller 的自定义指令或重构我们的代码以利用继承的作用域之外,是否有任何开箱即用的方法来做到这一点?

最佳答案

我不相信有一种开箱即用的方式。 ng-controller只是使用普通的 Controller 实例化,没有机会注入(inject)任何东西。

但这是一个有趣的“功能”,实际上可以使用自定义指令相对简单地构建它。

这是一个说明性示例( 免责声明 :绝对没有在晦涩的场景下进行测试):

.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);
}
};
});

用法如您所描述:
<div ng-controller="MainCtrl">
{{name}}
<div ng-controller="SecondCtrl" ng-inject="{foo: name, bar: 'bar'}">
</div>
</div>

当然, Controller 可以注入(inject)这些变量:
.controller("SecondCtrl", function($scope, foo, bar){
});

plunker

关于angularjs - 使用 ng-controller 注入(inject)所需的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28868373/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com