我有一个外部控制器,在其视图中包含一个指令。该指令获取一个过程点列表并生成链接,您可以在其中选择每个过程点。它在链接函数中正确设置了HTML,但链接的ng-click操作不起作用。
有什么想法吗? :)
非抢夺代码
HTML
<!DOCTYPE html>
<html>
<head><link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet">
<script src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular.min.js"></script>
<script src="script.js"></script>
</head>
<body ng-app="app">
<div ng-controller="widget">
<process stages="production" at="productionAt"></process>
</div>
</body>
</html>
JS
angular.module('app', ['app.directives', 'app.controllers']);
angular.module('app.controllers', [])
.controller('widget', function($scope) {
var selectStage = function () {
alert(this.label + " selected.");
$scope.processAt = this;
}
$scope.production = [
{label: "Starting", select: selectStage}
, {label: "Fermenting", select: selectStage}
, {label: "Pouring", select: selectStage}
, {label: "Beer!", select: selectStage}
];
$scope.productionAt = $scope.production[0];
});
angular.module('app.directives', [])
.directive('process', function() {
return {
restrict: 'E'
, replace: true
, template: '<ol class="nav nav-pills"></ol>'
, scope: {
stages: "="
, at: "="
}
, link: function postLink(scope, element, attrs) {
for (var i = 0; i < scope.stages.length; i++) {
var $stage = $('<li ng-click="stages['+i+'].select()"><a>'+scope.stages[i].label+'</a></li>');
if (scope.at == scope.stages[i]) {
$stage.addClass('active');
}
$(element).append($stage);
}
}
}
});
答案 0 :(得分:8)
为了使ng-click
指令工作,首先需要由角度基础设施处理('编译'),而不是在指令中手动创建li
元素,而不是哪个角度没有它们存在的线索,您可以在指令模板中使用ng-repeat
,如下所示(无需手动创建DOM元素):
angular.module('app.directives', [])
.directive('process', function() {
return {
restrict: 'E'
, replace: true
, template: '<ol class="nav nav-pills"><li ng-class="{active: stage==at}" ng-click="stage.select()" ng-repeat="stage in stages"><a>{{stage.label}}</a></li></ol>'
, scope: {
stages: "="
, at: "="
}
}
});
修改过的plunker:http://plnkr.co/edit/SW1Ph0nIjVYW3UzixtBx?p=preview
我认为这是最优雅的解决方案。当然,您可以将模板移动到永久文件并通过templateUrl
引用它。
或者,您可以在手动添加$compile
项目之后对元素使用li
服务,但感觉就像是黑客攻击。
答案 1 :(得分:2)
工作网址http://plnkr.co/edit/3zuDuQDjhA5UY5nLD09Z?p=preview
请在url指令中进行以下更改
angular.module('app.directives', [])
.directive('process', function($compile) {
return {
restrict: 'E'
, replace: true
, template: '<ol class="nav nav-pills"></ol>'
, scope: {
stages: "="
, at: "="
}
, link: function postLink(scope, element, attrs) {
for (var i = 0; i < scope.stages.length; i++) {
var $stage = $('<li ng-click="stages['+i+'].select()"><a>'+scope.stages[i].label+'</a></li>');
if (scope.at == scope.stages[i]) {
$stage.addClass('active');
}
$(element).append($stage);
$compile($(element))(scope);
}
}
}
});
我注入了$ complie并添加了一行$ compile($(element))(范围);