2015-11-19 3 views
3

У меня есть пользовательская угловая директива, которая для краткости мы просто позвоним карте.Угловое значение области изоляции может быть установлено «истинным» или пустым

У этого есть изоляционная область, настроенная таким образом.

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, просто используйте параметр $attrs в link функции директивы для всех четырех случаев использования:

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