Я пытаюсь создать настраиваемое событие для переключения с помощью Angular. Директива называется toggleable.Угловая директива, привязка события клика к внешнему элементу не работает
Сначала это звучит тривиально, но сложный бит заключается в том, что я хочу иметь возможность использовать любую кнопку или ссылку на странице для переключения.
Код я написал, как показано ниже
Директива
'use strict';
angular.module('onsComponents')
.directive('togglable', function() {
return {
restrict: 'A',
transclude: true,
scope: {
togglerId: '@',
show: '@'
},
link: function(scope, element, attrs) {
if (!scope.togglerId) {
console.error("Toggler id must be given")
return
}
scope.visible = (scope.show === 'true')
scope.toggle = function() {
alert("Before " + scope.visible)
scope.visible = !scope.visible
alert("After " + scope.visible)
}
//Bind click event to given dom element
angular.element('#' + scope.togglerId).bind("click", function() {
scope.toggle()
})
},
templateUrl: 'app/components/toggler/toggler.html'
}
})
Шаблон
<div ng-transclude ng-show="visible">
</div>
Взгляд
<a href="" id="toggleButton" >Click me to toggle</a>
<div togglable toggler-id="toggleButton">
Hey
</div>
Точка переключения, похоже, работает. Я вижу предупреждения при нажатии ссылки. Проблема заключается в том, что содержимое не отображается. Кажется, что ссылка на самом деле не в том же объеме с содержимым, другая область создается, когда я это делаю.
Если я перемещаю ссылку на клик в шаблоне, как показано ниже, он работает. Но это не совсем то, что я хочу.
<!-- Move the link inside template -->
<a href="" ng-click="toggle()" >Click me to toggle</a>
<div ng-transclude ng-show="visible">
</div>
Так как же я могу достичь этого?
Попробуйте вызвать 'рамки . $ apply() 'после вызова' scope.toggle() 'в прослушивателе событий. –
@NikosParaskevopoulos Да, он работает после вызова области. $ Appy(). Спасибо – Bren
@NikosParaskevopoulos Можете ли вы разместить это в качестве ответа? – Bren