2014-02-22 107 views
2

我是Angular的新手,我試圖創建一個指令並對孤立的範圍屬性有疑問。如果我有一個指令:AngularJS指令 - 是否需要隔離範圍屬性?

MyApp.directive('myDirective', function() { 
    return { 
     scope: { 
      symbol: '@' 
     }, 

...

是否有可能作出某種方式所需的符號?在我的情況下,如果它沒有提供指令將無法正常工作。

+0

如果某人未能提供該屬性,您會希望什麼行爲? –

+0

您的指令鏈接或控制器函數檢查scope.symbol未定義或您認爲錯誤的任何值然後拋出和錯誤如果沒有給出 –

+0

這將在開發過程中使用。在設計視圖時,通常會忘記或沒有意識到要求指令正確工作的特定屬性。需要提供某種視覺線索才能讓他們知道正確的用法。它可能是一個警報或敬酒,甚至用幫助文本替換模板的內容。 – Elliot

回答

1

您可以使用第二個指令並在第一個指令中要求。對於myDirective實際需要symbol

MyApp.directive('myDirective', function() { 
    return { 
     scope: { 
      symbol: '@' 
     }, 
     require: 'symbol', 
     link: angular.noop //this is needed to check for the required controller 
     ... 
    } 
} 

MyApp.directive('symbol', function() { 
    return { 
     controller: angular.noop 
    } 
} 

控制器是必要的。請記住,像這樣的情況下,用命名空間爲指令添加前綴至關重要。

這裏是一個jsfiddle這個工作的例子。在這個例子中,我已經覆蓋了角度錯誤服務,對所有錯誤發出警報。您可以看到錯誤的原因是<div>缺少所需的指令。

http://jsfiddle.net/fooby12/rqRg2/

+0

這絕對有效,但它可以包含在單個指令中。在鏈接函數中檢查attrs是否可能,以及何時丟失拋出錯誤?我會嘗試一下,看看我能否得到它的工作。我想答案是你實際上不需要設置屬性,但必須編寫你自己的代碼來檢查這個。 – Elliot

+0

我發現了一種爲此使用的鏈接函數: 'code' 鏈路:功能(範圍,元件,ATTRS){ 如果(attrs.requiredAttr ==未定義){// 手柄誤差作爲必要 } } 'code' – Elliot

+0

是的,在鏈接中檢查它是你可以隨時做的事情。使用'angular.isUndefined(attrs.requiredAttr)'是一種更安全的方法。我傾向於使用'require'屬性,因爲我可以隔離代碼以在自己的指令中驗證attr,並且角度拋出一個很好的'$ compile'錯誤。這也意味着您可以編寫更具體的測試,而且您不必測試缺少的attr代碼作爲主要指令的一部分。如果你真的想要先進的話,你可以動態地建立所需的指令,然後再進行角引導 – fooby