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