我已经在这个问题上工作了两天了。我觉得它应该简单得多。
问题描述
我想创建一个如下使用的指令:
<my-directive ng-something="something">
content
</my-directive>
并作为输出:
<my-directive ng-something="something" ng-more="more">
content
</my-directive>
自然它会有一个链接函数和控制器来做一些工作,但主要关注的是:
- DOM 元素保留原始名称,以便可以应用直观的 css 样式,
- 已经存在的属性指令继续正常工作,并且
- 新的属性指令可以由元素指令本身添加。
例子
例如,假设我想创建一个在单击它时在内部执行某些操作的元素:
<click-count ng-repeat="X in ['A', 'B', 'C']"> {{ X }} </click-count>
它可以编译成这样的:
<click-count ng-click="internalFn()"> A </click-count>
<click-count ng-click="internalFn()"> B </click-count>
<click-count ng-click="internalFn()"> C </click-count>
whereinternalFn
将在clickCount
指令的内部范围内定义。
试图
我的尝试之一是这个 Plunker:http ://plnkr.co/edit/j9sUUS?p=preview
由于 Plunker 似乎已关闭,因此代码如下:
angular.module('app', []).directive('clickCount', function() {
return {
restrict: 'E',
replace: true,
transclude: true,
scope: {
ccModel: '='
},
compile: function(dElement) {
dElement.attr("ngClick", "ccModel = ccModel + 1");
return function postLink($scope, iElement, iAttrs, controller, transclude) {
transclude(function(cloned) { iElement.append(cloned); });
};
},
controller: function ($scope) {
$scope.ccModel = 0;
}
};
});
这是使用该指令的一些 HTML:
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.13/angular.js"></script>
<link rel="stylesheet" href="style.css" />
<script src="script.js"></script>
</head>
<body ng-app="app">
<hr> The internal 'ng-click' doesn't work:
<click-count ng-repeat="X in ['A', 'B', 'C']" cc-model="counter">
{{ X }}, {{ counter }}
</click-count>
<hr> But an external 'ng-click' does work:
<click-count ng-repeat="X in ['A', 'B', 'C']" cc-model="bla" ng-init="counter = 0" ng-click="counter = counter + 1">
{{ X }}, {{ counter }}
</click-count>
<hr>
</body>
</html>
并且因为元素保留了它的名字,所以 css 可以按如下方式使用:
click-count {
display: block;
border: solid 1px;
background-color: lightgreen;
font-weight: bold;
margin: 5px;
padding: 5px;
}
我对它可能出现的问题有几个想法,但我尝试了许多替代方法。如果我在链接器中弄乱了,也许再试$compile
一次,控制器函数也必须调用两次。无论如何,将不胜感激如何正确执行此操作的示例。