По сути, я пытаюсь переопределить щелчок правой кнопкой мыши для определенных элементов и вместо этого отобразить короткое меню, в котором можно выбрать «setClear» или «unsetClear».Если я добавляю пользовательское контекстное меню непосредственно в тело HTML-кода, то оно работает нормально, но я не хочу добавлять его для каждого экземпляра директивы, я бы предпочел, чтобы директива создала и добавила менюСамо по себе, поскольку функция ng-click пропустит переменную, которая будет отличаться в каждом случае.
В настоящий момент правый клик отменяется, и когда я щелкаю правой кнопкой мыши по элементу, я получаю меню.Единственная проблема - когда я делаю выбор, кажется, что функция ng-click не срабатывает, и я не уверен, почему нет.Дело не в том, что он не может найти функцию в контроллере;когда я нажимаю на пункт меню, поведение, которое я вижу, выглядит так, как будто меню вообще не было, и я просто нажимаю на сам ярлык.
Вот HTML-код, в котором директива применяется к метке:
<label toggle-clear="labelOne" context="labelOne">Label One</label>
Когда я запускаю, если я проверяю элемент, я вижу, что меню есть и что нгвызов по щелчку мыши кажется правильным:
<label clearToggle="labelOne" context="labelOne">"Label One"
<ul id="labelOne" class="dropdown-menu">
<li><a ng-click="setClear(labelOne)">Set to Clear</a></li>
<li><a ng-click="unsetClear(labelOne)">Unset Clear</a></li>
</ul>
</label>
Это код директивы:
angular.module('myApp').directive('toggleClear', function ($parse, $compile) {
return {
compile: function(element, attrs) {
return function(scope, element, attrs) {
var ulTemplate = "<ul id='"+attrs.context+"' class='dropdown-menu' role='menu'>"+
"<li><a ng-click='setClear("+attrs.context+")'>Set to Clear</a></li>"+
"<li><a ng-click='unsetClear("+attrs.context+")'>Unset Clear</a></li>"+
"</ul>"
$compile(ulTemplate)(scope);
element.append(ulTemplate);
var fn = $parse(attrs.ngRightClick);
element.bind('contextmenu', function(event) {
event.preventDefault();
fn(scope, {$event:event});
});
}
}
};
});
(function(angular) {
var contextMenu = angular.module('directive.toggleClear', []);
contextMenu.directive('cellHighlight', function() {
return {
restrict: 'C',
link: function postLink(scope, el, attr) {
el.find('td').mouseover(function() {
$(this).parent('tr').css('opacity', '0.7');
}).mouseout(function() {
$(this).parent('tr').css('opacity', '1.0');
});
}
};
});
contextMenu.directive('context', [
function() {
return {
restrict: 'A',
scope: '@&',
compile: function compile(contextElement, contextAttrs, transclude) {
return {
post: function postLink(scope, elem, attrs, controller) {
var ul = $('#' + attrs.context),
end = null;
ul.css({
'display': 'none'
});
$(elem).bind('contextmenu', function(event) {
event.preventDefault();
ul.css({
position: 'fixed',
display: 'block',
left: event.clientX + 'px',
top: event.clientY + 'px'
});
end = event.timeStamp;
});
$(document).click(function(event) {
var target = $(event.target);
if (!target.is(".popover") && !target.parents().is(".popover")) {
if (end === event.timeStamp)
return;
ul.css({
'display': 'none'
});
}
});
}
};
}
};
}
])
})(window.angular);