我在所有这些角度都是新的......
我有一个自定义指令,我们称之为myDar。 在这个指令中,我定义了一个链接函数。 在我的html中,我想使用此指令的多个嵌套标签,如下所示:
<myDar id="outer"><myDar id="inner"></myDar></myDar>
我希望首先执行“outer”的链接功能。我该怎么做?
这是一般性问题。
如果它有帮助,那么我真正想做的是创建包装jquery ui layout(link to the website)的指令。所以我有“ui-layout”的指令和“中心”,“西方”等的指令。
在“ui-layout”指令中,我呼叫$(tElm).layout(options)
。
创建嵌套布局时遇到问题:
<ui-layout class="layout-container">
<ui-layout-center>
<ui-layout>
<ui-layout-center>inner center</ui-layout-center>
<ui-layout-west>inner west</ui-layout-west>
</ui-layout>
</ui-layout-center>
<ui-layout-west>west</ui-layout-west>
</ui-layout>
Angular首先执行内部“ui-layout”指令的链接功能,但是为了使jquery ui布局插件工作,需要首先调用外部的$(tElm).layout(options)
,否则布局不能正确呈现。 / p>
答案 0 :(得分:8)
为此,您将利用指令的控制器。它将是一个类,用于定义注册嵌套控制器的方法,另一个用于在此元素上执行所需命令(此处为$(...).layout(...)
),然后在其所有子项上执行 EM>。这意味着外部指令负责协调布局的创建。
完整的示例代码是:
app.directive("y", function() {
function Controller($element) {
this.$element = $element;
this.children = [];
}
Controller.prototype.register = function(child) {
this.children.push(child);
};
Controller.prototype.execute = function() {
console.log("PAYLOAD: " + this.$element.attr("id"));
for( var i=0; i < this.children.length; i++ ) {
this.children[i].execute();
}
};
return {
require: "y",
controller: ["$element", Controller],
link: function(scope, element, attrs, ctrl) {
var e = element.parent(), nested = false;
while( e != null ) {
if( e.controller("y") != null ) {
e.controller("y").register(ctrl);
nested = true;
break;
}
e = e.parent();
if( typeof(e.tagName) === "undefined" ) break; //XXX Needed, at least for fiddle
}
if( !nested ) ctrl.execute();
}
};
});
将行console.log("PAYLOAD: " + this.$element.attr("id"));
替换为要运行的实际代码。请参阅相关小提琴:http://jsfiddle.net/8xSjZ/
如果外部指令与当前指令不同,那么获取父控制器就像要求"?^y"
一样简单。在这种情况下,它为我们提供了当前的控制器,因此我们必须循环(e.parent()
)selfelfes。
答案 1 :(得分:2)
根据确切的用例,compile
函数可能非常合适。 compile
函数在link
函数之前执行,而且 - 更重要的是 - 以相反的顺序执行。首先是父母的意思。
app.directive("ui-layout", function() {
return {
restrict: 'E',
compile: function(element, attrs) {
//do layout stuff here
//return a link function or nothing
另一种解决方案可能是使用$timeout
执行子指令的相关代码。
app.directive("ui-layout-center", function($timeout) {
return {
restrict: 'E',
link: function(scope, element, attrs) {
$timeout(function() {
//do layout stuff later
}, 0);