【发布时间】:2015-11-07 03:23:06
【问题描述】:
我需要构建一个将自定义指令转换为 html 的转换指令。
- 输入如:
<link text="hello world"></link> - 应该输出到:
<a class="someclass" ng-click="linkClicked('hello world')"></a>
linkClicked 应该在指令的父控制器上调用。
如果我是负责持有“链接”指令(使用隔离范围)的 html 的人,那将非常容易,但我不是。这是一个原样输入,我必须想办法仍然这样做。
关于如何使用指令的默认范围进行类似绑定的示例不计其数,但我正在使用带有 controllerAs 的 John Papa's 建议编写我的控制器,但不想在控制器上创建另一个实例指令。
这是我到目前为止所达到的:
(function () {
'use strict';
angular
.module('app')
.directive('link', link);
link.$inject = ['$compile'];
function link($compile) {
return {
restrict: 'E',
replace: true,
template: '<a class="someclass"></a>',
terminal: true,
priority: 1000,
link: function (scope, element, attributes) {
element.removeAttr('link'); // Remove the attribute to avoid indefinite loop.
element.attr('ng-click', 'linkClicked(\'' + attributes.text + '\')');
$compile(element)(scope);
},
};
}
})();
-
$scope.linkClicked = function(text){...}在父控制器中工作。 -
指令中的
element.attr('ng-click', 'abc.linkClicked(..)')(其中父级的 controllerAs 是 abc)-也可以使用。
问题是我不知道哪个控制器会使用我的指令并且不能硬编码其中的“abc”名称。
你建议我应该怎么做?
【问题讨论】:
-
将你需要的东西作为属性传递给指令作用域,......那么父母是什么并不重要
-
你不应该在你的指令中对控制器做出假设——真的。而且,您不应该假设在使用该指令的视图范围内存在
linkClicked()。 -
显然,这个问题没有成功..感谢你们的评论。
-
@wilenx.,我仍然不清楚你想要完成什么。只需遵循隔离范围的正常指令方法并将所需的参数传递给指令即可。还有,
<a>的内容应该是什么? -
@NewDev,(1) 我收到一个 html 字符串,其中包括此链接指令等。它只有那个文本属性。如果可以的话,我会以一种可以以正常方式调用所需函数的方式(如您所建议的那样)重写该链接指令,但我必须自己生成和呈现这些调用。话虽如此,我需要调用我选择的父函数,传入文本进行处理。这是一个糟糕的情况,我明白了,但我仍然需要修补这个东西......(2)的内容与手头的事情无关。
标签: angularjs angularjs-directive angularjs-scope