将动态控制器分配给编译方法内的指令
Assigning Dynamic controller to directive inside compile method
我有一种情况,我想动态地将控制器分配给一个指令,但我不能将它作为参数传递。
这是我的代码
var app = angular.module('app', []);
app.controller('home', function($scope, $timeout) {
$scope.name = 'wow';
$timeout(function() {
console.log('changed');
$scope.name = 'wowowow';
}, 2000);
});
app.directive('modalBox', function($compile) {
return {
restrict: 'AE',
replace: true,
transclude: true,
compile: function() {
return {
pre: function($scope, $elem, $attr) {
$elem.attr('ng-controller', 'home');
$compile($elem.contents())($scope);
},
post: function($scope, $elem, $attr, controller) {
console.log($scope);
}
}
},
template: '<div><input type="text" ng-model="name"/>{{name}}</div>'
}
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
<div modal-box></div>
</div>
我知道我可以将控制器作为参数传递给指令,并且可以简单地将其称为控制器 属性,但我不能这样做,因为在我的实际情况下,控制器名称将由服务决定我会将该服务注入指令以获取控制器名称。
简而言之,我需要一些方法将控制器分配给编译方法中的指令。
您正在将 ng-controller
属性添加到 $elem
,它提供以下内容:
<div modal-box="" class="ng-binding" ng-controller="home">
<input type="text" ng-model="name" class="ng-pristine ng-untouched ng-valid">
</div>
然后您正在编译 $elem.contents()
,其中不包含 ng-controller
属性:
<input type="text" ng-model="name" class="ng-pristine ng-untouched ng-valid">
要么将属性添加到输入中,要么编译整个 div。
注意编译前需要去掉指令否则会死循环:
$elem.attr('ng-controller', 'home');
$elem.removeAttr('modal-box');
$compile($elem)($scope);
我有一种情况,我想动态地将控制器分配给一个指令,但我不能将它作为参数传递。
这是我的代码
var app = angular.module('app', []);
app.controller('home', function($scope, $timeout) {
$scope.name = 'wow';
$timeout(function() {
console.log('changed');
$scope.name = 'wowowow';
}, 2000);
});
app.directive('modalBox', function($compile) {
return {
restrict: 'AE',
replace: true,
transclude: true,
compile: function() {
return {
pre: function($scope, $elem, $attr) {
$elem.attr('ng-controller', 'home');
$compile($elem.contents())($scope);
},
post: function($scope, $elem, $attr, controller) {
console.log($scope);
}
}
},
template: '<div><input type="text" ng-model="name"/>{{name}}</div>'
}
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
<div modal-box></div>
</div>
我知道我可以将控制器作为参数传递给指令,并且可以简单地将其称为控制器 属性,但我不能这样做,因为在我的实际情况下,控制器名称将由服务决定我会将该服务注入指令以获取控制器名称。
简而言之,我需要一些方法将控制器分配给编译方法中的指令。
您正在将 ng-controller
属性添加到 $elem
,它提供以下内容:
<div modal-box="" class="ng-binding" ng-controller="home">
<input type="text" ng-model="name" class="ng-pristine ng-untouched ng-valid">
</div>
然后您正在编译 $elem.contents()
,其中不包含 ng-controller
属性:
<input type="text" ng-model="name" class="ng-pristine ng-untouched ng-valid">
要么将属性添加到输入中,要么编译整个 div。
注意编译前需要去掉指令否则会死循环:
$elem.attr('ng-controller', 'home');
$elem.removeAttr('modal-box');
$compile($elem)($scope);