<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<script>
var app = angular.module( "test", [] );
app.run(function () {
angular.element.prototype.has = function(selector) {
if ( ! this.length || typeof this === 'undefined' ) return false;
console.log ( selector );
};
});
app.directive('cacat', function() {
return {
restrict: 'E',
link: function (scope, element, attrs) {
var g = element[0].querySelector('span');
if ( angular.element(g).length ) {
element.has(element.has(g) );
}
}
};
});
</script>
</head>
<body ng-app="test">
<cacat>
<span>da</span>
</cacat>
</body>
</html>
Почему.has называется 2 раза? И первый раз я получаю хороший элемент, второй раз я получаю неопределенный элемент, и он переходит из условия.
element.has(element.has(g) );
вот ваши два звонка. Я не уверен, что вы ожидали, но оба вызова возвращаются undefined
потому что они проходят ! this.length || typeof this === 'undefined'
! this.length || typeof this === 'undefined'
! this.length || typeof this === 'undefined'
test (где this
относится к вашему элементу cacat
, который имеет ненулевую длину), и нет возврата за пределы этой точки, таким образом, неявное undefined
возвращаемое значение.
Вы вызываете метод дважды:
element.has(element.has(g));
Поскольку .has()
не возвращает значение при вызове с допустимым элементом, во втором вызове вы получите undefined
значение.
false
как определено.console.log
будет работать из-за! this.length