我想根据我们加载的配置动态指定一个控制器。像这样的东西:
<div ng-controller="{{config.controllerNameString}}>
...
</div>
我如何在角度上做到这一点?我认为这会很容易,但我似乎可以找到一种方法来做到这一点。
我想根据我们加载的配置动态指定一个控制器。像这样的东西:
<div ng-controller="{{config.controllerNameString}}>
...
</div>
我如何在角度上做到这一点?我认为这会很容易,但我似乎可以找到一种方法来做到这一点。
你想要做的是在调用其他任何东西之前运行另一个指令,从某个模型中获取控制器名称,删除新指令并添加ng-controller
指令,然后重新编译元素。
看起来像这样:
global.directive('dynamicCtrl', ['$compile', '$parse',function($compile, $parse) {
return {
restrict: 'A',
terminal: true,
priority: 100000,
link: function(scope, elem) {
var name = $parse(elem.attr('dynamic-ctrl'))(scope);
elem.removeAttr('dynamic-ctrl');
elem.attr('ng-controller', name);
$compile(elem)(scope);
}
};
}]);
然后你可以在你的模板中使用它,像这样:
<div dynamic-ctrl="'blankCtrl'">{{tyler}}</div>
使用这样的控制器:
global.controller('blankCtrl',['$scope',function(tyler){
tyler.tyler = 'tyler';
tyler.tyler = 'chameleon';
}]);
可能有一种方法可以插入值 ( $interpolate
)dynamic-ctrl
而不是解析它 ( $parse
),但由于某种原因我无法让它工作。
我在 ng-repeat 中使用它,所以这是循环和子对象的改进代码:
模板:
<div class="col-xs6 col-sm-5 col-md-4 col-lg-3" ng-repeat="box in boxes">
<div ng-include src="'/assets/js/view/box_campaign.html'" ng-dynamic-controller="box.type"></div>
</div>
指示:
mainApp.directive('ngDynamicController', ['$compile', '$parse',function($compile, $parse) {
return {
scope: {
name: '=ngDynamicController'
},
restrict: 'A',
terminal: true,
priority: 100000,
link: function(scope, elem, attrs) {
elem.attr('ng-controller', scope.name);
elem.removeAttr('ng-dynamic-controller');
$compile(elem)(scope);
}
};
}]);
就个人而言,这里的 2 个当前解决方案对我不起作用,因为在第一次编译元素时不知道控制器的名称,但后来在另一个摘要循环中。因此我最终使用了:
myapp.directive('dynamicController', ['$controller', function($controller) {
return {
restrict: 'A',
scope: true,
link: function(scope, elem, attrs) {
attrs.$observe('dynamicController', function(name) {
if (name) {
elem.data('$Controller', $controller(name, {
$scope: scope,
$element: elem,
$attrs: attrs
}));
}
});
}
};
}]);