2015-11-19 49 views
3

我有一个自定义的角度指令,为了简洁起见我们只需要调用map。角度隔离范围值可以通过“true”或者空值来设置

它具有像这样设置的隔离范围。

scope: { 
    latitude: '=?', 
    longitude: '=?', 
    draggable: '=?' 
}, 

我通常把东西在我的链接功能,设置的范围值是无论什么已经在属性,或默认设置,如果没有已定,因此devoloper可以,如果他们添加拖动=“假”想要,否则我们会自动默认它为true,所以在链接函数中我会有这个。

$scope.draggable = angular.isDefined($scope.draggable) ? $scope.draggable : myDefaults.draggable; 

的问题是,我希望所有的以下是有效的用途在HTML

<map draggable></map> 
<map draggable="true"></map> 
<map draggable="false"></map> 

但第一线不会起作用,因为angular.isDefined()是假的。

我应该检查它是否先定义,如果不是,那么使用类似attrs.draggable的东西来查看属性是否存在,然后再回到默认值?

如果是这样,那么还有一个复杂因素,因为我需要将我的代码放在控制器中,而不是链接函数(因为它需要与子指令交谈),并且我无法访问“attrs”或“element “从控制器。

任何帮助将不胜感激。

回答

1

如果你不想使用范围变量在draggable属性,只需使用该指令的link功能$attrs参数为您的使用情况下,所有四种:

link: function ($scope, $element, $attrs) { 
    if ("draggable" in $attrs) { 
     $scope.draggable = $scope.draggable === "" || $attrs.draggable === "true"; 
    } else { 
     $scope.draggable = myDefaults.draggable; 
    } 
} 

解释:如果draggable属性不存在,它不会在$attrs对象中。如果它存在但未设置,则它将等于空字符串。如果它存在并且已设置,它将等于您将其设置为的字符串值:"true""false"

如果使用$attrs,不用担心通过指令的scope属性指定可拖动 - 它会被覆盖。

请注意,如上所述,此解决方案不允许您将范围变量绑定到属性。为此,您必须在指令上使用scope属性。

对于好奇,the link function

+0

谢谢,但是对于''这会是真的吗?除非我错了我认为这将是错误的 – jonhobbs

+0

@jonhobbs对于'','$ attrs.draggable'将在'link'函数中未定义,在这种情况下将使用'myDefaults.draggable'。 – Amasa

+0

是的,这就是我的想法。我需要它是真实的,当draggable属性存在但没有设置,这就是为什么我奋斗:) – jonhobbs