2013-10-08 103 views
2

我有一个模板,它看起来像:角JS指令动态模板结合

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

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

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

我localClickFunc在与控制器功能范围指令绑定(他们可能绑定为“=”为我的情况无关紧要)。

的问题是,在这个“myButton的”指令的用法并不是所有属性都是必需的。如果我与所有其他事件将被注册,并通过角发射到一个空操作功能,使用它。

我可以在屏幕上。什么多达1000按钮将是解决这个?有条件模板吗?

回答

2

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

然而,功能绑定(&)永远是可选的,只要角度而言。即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)" 
/> 

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

+0

不知道的是,票选:) – bresleveloper

+0

我怎么能打开上单击到NG点击? –

+0

你为什么要这么做?编辑可能会澄清预期的用法。 –

0

你可以发送attr那样的指令名称是mydir,然后在链接和编译函数中,第三个参数的其中一个通常是PARAMS的名称,并且你可以通过params.mydir(值为ovidiu)来到那里。你可以发送任何基于文本的';'分离为“click; dbclick; onmouseout”,并用params.mydir.split(';')将其分解到指令中。从那里你甚至可以去参加诸如“allClicks”这样的活动组,只需在链接中添加一些字典或开关,它们就会附加正确的内容。