2014-02-22 116 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