親スコープにアクセスできるngMessagesを使用してカスタムバリデータを接続する方法を見つけようとしています。住所の入力フィールドがあり、住所onBlur
の地理位置情報を取得し、地図上のマーカーの位置を更新したい (コントローラに 2 つの変数を設定することによりthis
)。
カスタムバリデーターの例ではディレクティブを使用しています (基本的な例ではディレクティブに従いました) が、ディレクティブから地理位置情報に移動できません。
- scope.$parent を使用してリンク関数から親コントローラーにアクセスしようとすることから始めました ( AngularJS のカスタム ディレクティブ *with own scope* 内から親スコープにアクセスする方法は? ) が、私は ES6 クラスを使用しています。うまくいかないようでした。
- 現在、親関数をディレクティブに渡すことを考えていますが、関数はコントローラーの通常のスコープの要素を見つけることができないと不平を言っているため、マーカーの位置を更新できません。
配線のアドバイスありがとうございます。
2番目のインスタンスで到達した場所は次のとおりです
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";
}
});
});