2

我有一个看起来像的模板:

scope:{
  localClickFunc: "&click",
  myLocalDbClickFunc: "&dblclick"
} ...

 <myButton  ng-click="localClickFunc($event)" ng-doubleckick="myLocalDbClickFunc($event)"/>

还有许多其他事件(鼠标悬停等)

我的 localClickFunc 在范围指令中与控制器功能绑定(对于我的情况,它们可以与“=”绑定没关系)。

问题是,在使用这个“myButton”指令时,并非所有属性都是必需的。如果我将它与所有其他事件一起使用,将通过角度注册并触发到 noop 函数。

我可以在屏幕上有多达 1000 个按钮。对此有什么解决方案?有条件模板吗?

4

2 回答 2

2

?范围绑定定义中的 使属性是可选的。

然而,&就 Angular 而言,函数绑定 ( ) 始终是可选的。即,如果您没有在此绑定中指定函数,Angular 将不会抱怨,并且无论如何它都会将函数置于指令的范围内。所以你不能写if( scope.localClickFunc == null )来检查它的存在。

我建议使用可选绑定=?来指定回调。这样,您将能够检查绑定是否存在的范围,并且仅当它存在时,才将其绑定到实际的 DOM 事件。示例代码:

scope:{
    localClickFunc: "=?click",
    localDbClickFunc: "=?dblclick"
},
link: function(scope, element, attrs) {
    ...
    if( scope.localClickFunc != null ) {
        element.on("click", scope.localClickFunc);
    }
    ...
}

然后将该指令用作:

<myButton click="localClickFunc($event)"
          dblclick="myLocalDbClickFunc($event)"
/>

您可以指定任何或所有属性,并且将相应地安装处理程序。

于 2013-10-08T11:30:14.217 回答
0

您可以发送 attr,例如说指令名称是 mydir,然后在链接和编译函数中,第三个参数之一通常是名称作为参数,您可以通过 params.mydir 到达那里(值将是 ovidiu)。您可以发送任何基于文本的内容,例如“;” 像“click;dbclick;onmouseout”一样分隔,并在指令中使用 params.mydir.split(';') 将其分解。从那里您甚至可以转到诸如“allClicks”之类的事件组,您只需要在链接中添加一些字典或开关即可附加正确的内容。

于 2013-10-08T11:16:33.100 回答