angularjs 指令 - 功能无法正常工作
angularjs directive - functions not working properly
我正在尝试编写一个创建子菜单的指令。
我的想法是让这个指令非常灵活,这样我就可以在需要的时候重新使用它。
基本概念如下:
<my-submenu>
<li my-function="test()">Test</li>
<li my-function="test2()">Test 2</li>
<li my-function="test3(id, type)">Test 3</li>
<li ui-sref="test ({id: id})">Test 4</li>
</my-submenu>
这是一个非常简单的模板。需要包含在我的子菜单中的所有元素都在指令声明中,如上所示。
指令部分:
angular.module('submenu', []).directive('mySubmenu', [
function() {
var linkFunction;
linkFunction = function(scope, el, attr) {
console.log("scope: ", scope);
console.log("el: ", el);
return console.log("Attr: ", attr);
};
return {
restrict: 'E',
transclude: true,
templateUrl: './submenu.tpl.html',
scope: {
myFunction: '&'
},
link: linkFunction
};
}
]);
和指令模板:
<ul ng-transclude></ul>
现在,编译后的结果很像我想要的:
<my-submenu>
<ul ng-transclude="">
<li my-function="test()">Test</li>
<li my-function="test2()">Test 2</li>
<li my-function="test3(id, type)">Test 3</li>
<li ui-sref="test ({id: id})">Test 4</li>
</ul>
</hg-room-submenu>
但是这样做我失去了所有的功能,它们不再工作了。
我读到如果你想使用函数,你需要像我一样使用“&”,但它仍然不起作用。
有什么建议吗?而且,这是创建此类内容的最佳方法,还是我应该做一些不同的事情?
谢谢
PS:我也试过在编译代码中把my-function
改成ng-click
,还是不行。
这实际上是我需要帮助的另一件事 - 如何在编译的指令模板中将 my-function
转换为 ng-click
?或者我可以只使用 ng-click
而不是 my-function
吗?
在指令内的嵌套元素上使用 my-function
对指令无关紧要。它将保持原样——一个无意义的属性。 &
属性绑定(就此而言 - 任何指令绑定)只有在与指令位于同一元素上时才有效。
在您的情况下,您只需在预编译的 HTML 中使用 ng-click
。
附带说明一下,就 angular 的指令编译器而言,在编译指令后动态更改属性不会对指令或范围绑定产生任何影响。新属性不会被编译成指令或创建绑定到范围,删除的属性不会 "undo" 绑定到范围。指令编译器只会收集元素被编译时存在于元素上的属性。
我正在尝试编写一个创建子菜单的指令。
我的想法是让这个指令非常灵活,这样我就可以在需要的时候重新使用它。
基本概念如下:
<my-submenu>
<li my-function="test()">Test</li>
<li my-function="test2()">Test 2</li>
<li my-function="test3(id, type)">Test 3</li>
<li ui-sref="test ({id: id})">Test 4</li>
</my-submenu>
这是一个非常简单的模板。需要包含在我的子菜单中的所有元素都在指令声明中,如上所示。
指令部分:
angular.module('submenu', []).directive('mySubmenu', [
function() {
var linkFunction;
linkFunction = function(scope, el, attr) {
console.log("scope: ", scope);
console.log("el: ", el);
return console.log("Attr: ", attr);
};
return {
restrict: 'E',
transclude: true,
templateUrl: './submenu.tpl.html',
scope: {
myFunction: '&'
},
link: linkFunction
};
}
]);
和指令模板:
<ul ng-transclude></ul>
现在,编译后的结果很像我想要的:
<my-submenu>
<ul ng-transclude="">
<li my-function="test()">Test</li>
<li my-function="test2()">Test 2</li>
<li my-function="test3(id, type)">Test 3</li>
<li ui-sref="test ({id: id})">Test 4</li>
</ul>
</hg-room-submenu>
但是这样做我失去了所有的功能,它们不再工作了。
我读到如果你想使用函数,你需要像我一样使用“&”,但它仍然不起作用。
有什么建议吗?而且,这是创建此类内容的最佳方法,还是我应该做一些不同的事情?
谢谢
PS:我也试过在编译代码中把my-function
改成ng-click
,还是不行。
这实际上是我需要帮助的另一件事 - 如何在编译的指令模板中将 my-function
转换为 ng-click
?或者我可以只使用 ng-click
而不是 my-function
吗?
在指令内的嵌套元素上使用 my-function
对指令无关紧要。它将保持原样——一个无意义的属性。 &
属性绑定(就此而言 - 任何指令绑定)只有在与指令位于同一元素上时才有效。
在您的情况下,您只需在预编译的 HTML 中使用 ng-click
。
附带说明一下,就 angular 的指令编译器而言,在编译指令后动态更改属性不会对指令或范围绑定产生任何影响。新属性不会被编译成指令或创建绑定到范围,删除的属性不会 "undo" 绑定到范围。指令编译器只会收集元素被编译时存在于元素上的属性。