2013-10-08 131 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」這樣的活動組,只需在鏈接中添加一些字典或開關,它們就會附加正確的內容。