我正在转换一些代码以使用angular指令。我是新来的..
旧代码是:
$('.header .mobile-nav ').append($('.navigation').html());
$('.header .mobile-nav li').bind('click', function(e) {
var $this = $(this);
var $ulKid = $this.find('>ul');
var $ulKidA = $this.find('>a');
if ($ulKid.length === 0 && $ulKidA[0].nodeName.toLowerCase() === 'a') {
window.location.href = $ulKidA.attr('href');
}
else {
$ulKid.toggle(0, function() {
if ($(this).css('display') === 'block') {
$ulKidA.find('.icon-chevron-down').removeClass('icon-chevron-down').addClass('icon-chevron-up');
}
else {
$ulKidA.find('.icon-chevron-up').removeClass('icon-chevron-up').addClass('icon-chevron-down');
}
});
}
e.stopPropagation();
return false;
});
我尝试创造正确的指令如下:
app.directive('mobilenav', function () {
return { template: $('.navigation').html() };
});
app.directive('mobileNavMenu', function () {
var directive = {
link: link,
restrict: 'A'
};
return directive;
function link(scope, element, attrs) {
var iElement = element.find('.header .mobile-nav li');
iElement.bind('click', function (e) {
var $this = $(this);
var $ulKid = $this.find('* > ul');
var $ulKidA = $this.find('* > a');
if ($ulKid.length === 0 && $ulKidA[0].nodeName.toLowerCase() === 'a') {
window.location.href = $ulKidA.attr('href');
} else {
$ulKid.toggle(0, function () {
if ($(this).css('display') === 'block') {
$ulKidA.find('.icon-chevron-down').removeClass('icon-chevron-down').addClass('icon-chevron-up');
} else {
$ulKidA.find('.icon-chevron-up').removeClass('icon-chevron-up').addClass('icon-chevron-down');
}
});
}
e.stopPropagation();
return false;
});
}
});
“click”事件未受约束。我想这可能是因为它找不到元素。我使用正确的方法吗?你能帮我解决一下我的指示吗?
谢谢!
答案 0 :(得分:0)
我认为使用这种方法可以做得更好。首先,我认为您的指令不应该通过CSS搜索或修改其他元素。
所以首先我要修改这个指令直接绑定传入的元素:
function link(scope, element, attrs) {
//var iElement = element.find('.header .mobile-nav li');
iElement.bind('click', function (e) {
...
这可能意味着您需要将指令应用于与您最初想要的元素不同的元素。
接下来,对于您切换V形符号的部分,我认为您可能希望以不同方式执行此操作。例如,您可以在作用域或服务中设置变量,然后创建另一个指令来监视该变量并响应其中的更改。或者,您可以根据更改使用ng-show / ng-hide到元素。
这些问题也可能对您有所帮助: