Функция вызывается 2 раза, я ожидал один раз

0
<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 раза? И первый раз я получаю хороший элемент, второй раз я получаю неопределенный элемент, и он переходит из условия.

Теги:
function

2 ответа

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 возвращаемое значение.

  • 0
    Я не думаю, что второе утверждение является правильным, оно не возвращает false как определено. console.log будет работать из-за ! this.length
  • 0
    Я ТАК непреднамеренно
0

Вы вызываете метод дважды:

element.has(element.has(g));

Поскольку .has() не возвращает значение при вызове с допустимым элементом, во втором вызове вы получите undefined значение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню