Запрет обратной передачи из угловой директивы

0

У меня есть runat="server", у которого есть __doPostBack в href.

Я хотел бы подтвердить, что другое поле было завершено, когда щелкнул якорь, и разрешить только обратный вызов, если поле не пустое.

Я добавил настраиваемую директиву для этого:

angular.module('app').directive('notEmpty', function ($timeout, $document) {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {
            element.bind('click', function (event) {

                return $timeout(function () {
                    var elementToCheckNotEmpty = $document[0].querySelector(attrs.notEmpty);

                    if (!elementToCheckNotEmpty.value) {
                        scope.addInvalidClass = true; // input has an ng-class binding to $scope.addInvalidClass
                        event.preventDefault();
                        event.stopPropagation();

                        return false;
                    }
                });
            });
        }
    }
});

Это не препятствует обратной передаче. Обновление свойства scope и добавление класса к входу работает, потому что я вижу недопустимый класс, применяемый на пару секунд, пока происходит обратная передача.

Я понимаю, что $timeout возвращает обещание, поэтому я попытался связать его с $timeout так:

return $timeout(function () {
    var elementToCheckNotEmpty = $document[0].querySelector(attrs.omwNotEmpty);

    if (!elementToCheckNotEmpty.value) {
        scope.addInvalidClass = true;
    }
}).then(function () {
    if (scope.addInvalidClass) {
        event.preventDefault();
        event.stopPropagation();
        return false;
    }
});

Но это не препятствует обратной передаче. Это проект webforms с общей мастер-страницей, поэтому я не могу реально обновить элемент form без потенциального влияния на многие другие страницы. Форма имеет пустой атрибут action. Кроме того, атрибут ng-controller находится внутри элемента form, не уверен, что это имеет значение...

Что я делаю не так? Я очень новичок в Angular btw, так извиняюсь, если это тривиально!

  • 0
    Почему вам нужно использовать $ timeout?
  • 0
    Без этого привязка ng-класса к элементу, который я хочу быть не пустым, не работает. Свойство я меняюсь на сфере, изменяется, но привязка не добавляет класса. Но это не мешает обратной передачи
Показать ещё 3 комментария
Теги:
angularjs-directive
webforms

1 ответ

1
Лучший ответ

Использование $ timeout добавляет функцию в асинхронную очередь, тем самым не препятствуя обратной передаче. И привязка не изменяется, если не используется $ timeout, поскольку клик не находится в цикле углового дайджеста. Вместо $ timeout включайте изменения области с областью. $ Apply() или вы можете просто использовать ng-click вместо element.bind.

Ещё вопросы

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