gpt4 book ai didi

javascript - 从 AngularJS Controller 中,如何解析模块中定义的另一个 Controller 函数(动态 ng-controller)?

转载 作者:行者123 更新时间:2023-12-03 06:59:45 25 4
gpt4 key购买 nike

不言自明的 fiddle :http://jsfiddle.net/5FG2n/6/

我需要根据字符串名称动态选择要在运行时使用的 Controller 。该字符串将从配置对象中读取。

在下面的代码中,我当前将 InnerCtrlAsLocalVariable 分配给 $scope.dynamicCtrl。如何将 InnerCtrlFromModule 分配给该属性?

查看:

<div ng-app='app' ng-controller='OuterCtrl'>
<div ng-controller='dynamicCtrl'>
{{message}}
</div>
</div>

JS:

var InnerCtrlAsLocalVariable = ['$scope',
function($scope) {
$scope.message = 'from controller as local variable - do not want'
}
];

angular.module('app', [])

.controller('OuterCtrl', ['$scope',

function($scope) {
// Instead of doing this...
$scope.dynamicCtrl = InnerCtrlAsLocalVariable;

// ...I want to do something like this:
// $scope.dynamicCtrl = resolveCtrl('InnerCtrlFromModule');
}
])

.controller('InnerCtrlFromModule', ['$scope',
function($scope) {
$scope.message = 'from controller defined in module - want';
}
]);

最佳答案

您可以尝试编写自定义指令:

.directive("ngDynamicController",function($compile){
return {
terminal: true,
priority: 1000,
link:function(scope,element,attr){
var controllerProperty = scope[attr.ngDynamicController];
element.attr('ng-controller', controllerProperty);
element.removeAttr("ng-dynamic-controller");
$compile(element)(scope);
}
}
})

如果您需要更多信息,为什么我们必须添加 terminal: truepriority: 1000。看看我对这个问题的回答:Add directives from directive in AngularJS

DEMO

您可以尝试将其作为值注入(inject):

angular.module('app', [])
.value('InnerCtrl',InnerCtrlAsLocalVariable)
.controller('OuterCtrl', ['$scope','InnerCtrl',
function($scope, InnerCtrl) { //inject the value into the function
$scope.dynamicCtrl = InnerCtrl;
}
])

DEMO

或者使用$injector动态解析:

var InnerCtrlAsLocalVariable = ['$scope',
function($scope) {
$scope.message = 'from controller defined in module - want';
}
]

angular.module('app', [])
.value('InnerCtrl',InnerCtrlAsLocalVariable)
.controller('OuterCtrl', ['$scope','$injector',
function($scope, $injector) { //inject the $injector service.

// resolve the value dynamically
$scope.dynamicCtrl = $injector.get('InnerCtrl');

}
])

.controller('InnerCtrlFromModule', InnerCtrlAsLocalVariable)

DEMO

您可以使用$controller服务动态创建 Controller 实例,从该实例我们可以使用constructor属性检索构造函数

 angular.module('app', [])
.controller('OuterCtrl', ['$scope','$controller',
function(scope, $controller) {

scope.dynamicCtrl = $controller('InnerCtrlFromModule',{$scope:scope.$new()}).constructor;

}
])

.controller('InnerCtrlFromModule',['$scope', function($scope) {
$scope.message = 'from controller defined in module - want';
}])

DEMO

关于javascript - 从 AngularJS Controller 中,如何解析模块中定义的另一个 Controller 函数(动态 ng-controller)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21204371/

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