0

ajax 呼び出しの成功ノードからウィジェット関数を呼び出そうとしていますが、成功していません。

私のアプリでは、ユーザーが Google マップに説明付きのマーカーを追加できます。JQuery-addresspicker ウィジェットと Rails を使用しています。マーカーの追加を担当する関数を追加しました。説明テキストエリアと情報を送信するためのボタンを含むフォームが表示されます。したがって、ユーザーが送信した後、アプリは Ajax 関数を呼び出してユーザーのデータを保存します。成功した場合は、InfoWindow を閉じるためだけに別のウィジェット関数を呼び出したいと考えています。

問題は、成功した Ajax ノードから別のウィジェット関数を呼び出す方法がわからないことです。

JQuery-addresspicker.js
.
.
.

_addFormListener: function(map, marker) {
    var form = $(".add-form").clone().show();
    var infoWindowContent = form[0];
    var infoWindow = new google.maps.InfoWindow({
        content: infoWindowContent
    });

    google.maps.event.addListener(marker, "click", function() {
        infoWindow.open(map, this);
    });

    form.submit(function (event){
       event.preventDefault();

       var description = $("textarea[name=description]", this).val();
       var latitude    = marker.getPosition().lat();
       var longitude   = marker.getPosition().lng();

       var data = {
         description    : description,
         latitude       : latitude,
         longitude      : longitude
       };

       $.ajax({
        type : "POST",
        url  : "/places",
        data: {place: data},
        beforeSend: function(x) {
            x.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))
        },
        success: function(x) {
            this._closeFormFields(); // Not working!
        }
       });
    });
},

_cleanFormFields: function() {
  console.log("testing");
}
.
.

PlacesController
def create
@place = Place.new(params[:place])

if @place.save
  redirect_to places_path
else
  render :status => 422
end

終わり

ブラウザのコンソールで「Uncaught TypeError: Object [object Window] has no method '_cleanFormFields'」が発生します

何か案は?ありがとう!

4

1 に答える 1

0

ここでの問題は、この範囲です。ajax 呼び出しはこれを上書きして ajax 呼び出しオブジェクトを参照し、ウィジェットの参照を失います。

これを修正するには、次のようにウィジェットへの参照を格納する変数を追加するだけです

 form.submit(function (event){
   event.preventDefault();

   var description = $("textarea[name=description]", this).val();
   var latitude    = marker.getPosition().lat();
   var longitude   = marker.getPosition().lng();

   var data = {
     description    : description,
     latitude       : latitude,
     longitude      : longitude
   };

   //new widget reference var (this here still refers to the widget)
   var widget = this;

   $.ajax({
    type : "POST",
    url  : "/places",
    data: {place: data},
    beforeSend: function(x) {
        x.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))
    },
    success: function(x) {
        //now use the var widget here
        widget._closeFormFields(); // Works!
    }
   });
});
于 2013-08-09T16:22:29.777 に答える