0

親スコープにアクセスできる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";
                }
            });
        });
4

0 に答える 0