ngMessages с пользовательским валидатором в родительском контроллере
Я пытаюсь выяснить, как подключить пользовательский валидатор с ngMessages, который имеет доступ к родительской области. У меня есть поле ввода для адреса и onBlur
Я хочу сделать геолокацию адреса и обновить положение маркера на карте (путем установки двух переменных на контроллерах this
).
Пользовательские примеры валидаторов используют директивы (и я следовал за ними для базового примера), но не могу перейти от их к геолокации, так как я борюсь с Директивой на связь с родительским Контроллером в контексте ES6, ControllerAs,...:
- Я начал пытаться получить доступ к родительскому контроллеру с помощью функции link с областью действия.$ Parent ( Как получить доступ к родительской области из пользовательской директивы * с собственной областью * в AngularJS?), Но я использую классы ES6, и это просто не похоже на работу.
- сейчас я думаю о передаче родительской функции в директиву, но функция жалуется, что не может найти элементы нормальной области видимости контроллера, что означает, что она не может обновить позицию маркера.
Благодарен за совет по подключению этого.
Вот куда я попал во второй раз
var checkAddressDir = function($timeout) {
return {
require : 'ngModel',
scope: {
geolookup: '&'
},
link : function(scope, element, attrs, ngModel) {
function setAsLoading(bool) {
ngModel.$setValidity('recordLoading', !bool);
}
ngModel.$parsers.push(function(value) {
if(!value || value.length == 0) return;
setAsLoading(true);
scope.geolookup()(value)
// scope.$parent.findAddress()
.then( res => {
// I'll use res to update ngModel.$setValidity
console.log(res);
setAsLoading(false);
});
// THE FOLLOWING SERVED TO GET ME STARTED
// $timeout(function() {
// console.log("timeout");
// setAsLoading(false);
// }, 1000);
return value;
})
}
}
}
И это та функция контроллера, которую мне нужно использовать с областью действия контроллера.
findAddress(address) {
return this.$q( (resolve, reject) => {
mygeocoder.geocode(myOptions, (res, stat) => {
if (stat === google.maps.GeocoderStatus.OK) {
if (res.length > 1) {
console.log(`Need unique result, but got ${res.length}`);
return "notUnique";
}
var loc = res[0].geometry.location;
this.resto.lat = loc.lat();
this.resto.lng = loc.lng();
this.zoom = 16;
this.$scope.$apply();
return "good";
} else {
console.log(" not found - try again?");
return "notFound";
}
});
});