1

CalendarViewerPortletカスタムオブジェクトJSオブジェクトを作成しました。このオブジェクトには、ポートレットのIDやコンテキストパスなどを格納しています。オブジェクトには多くのカスタムメソッドもあり、メンバー変数を取得/設定するためのものと、特定のことを行うためのものがあります。

「this」を使用してオブジェクトの関数を参照しようとすると。jQuery関数の内部で、それは爆発します。その文脈での「これ」という用語はおそらく他の何かを指していると思いますが、問題を回避して、必要に応じてオブジェクトを参照させる方法がわかりません。

問題のあるコードは次のとおりです。

jQuery.ajax({
  url: jQuery(formSel).attr("action"), 
  type: "POST", 
  data: jQuery(formSel).serialize(), 
  beforeSend: function(xhr) {
  jQuery(msgSel).hide();
  jQuery(msgSel).html("");
  jQuery(tableSel).hide();
  jQuery(pagerSel).hide();
  jQuery(cpSelector).block({
  message: "<img src='"+this.getContextPath()+"/images/icon_loading.gif' align='absmiddle' alt='Loading...' /> Fetching events..."
  });
},

「this.getContextPath()」に注意してください。ここでコードが失敗します。カスタムオブジェクトのgetContextPath()関数を参照しようとしています。どうやってやるの?

4

6 に答える 6

6

問題は、コード this.getContextPath() が ajax() 関数のオプションとして渡される無名関数で後で実行されることです。したがって、必要な「this」(カスタム JS オブジェクト) は、メソッドの実行時点では使用できません。それを変数に格納して、関数「クロージャー」に参照させることができます。以下が機能するはずです。

var calendarViewer = this;

jQuery.ajax({
  url: jQuery(formSel).attr("action"), 
  type: "POST", 
  data: jQuery(formSel).serialize(), 
  beforeSend: function(xhr) {
  jQuery(msgSel).hide();
  jQuery(msgSel).html("");
  jQuery(tableSel).hide();
  jQuery(pagerSel).hide();
  jQuery(cpSelector).block({
  message: "<img src='"+calendarViewer.getContextPath()+"/images/icon_loading.gif' align='absmiddle' alt='Loading...' /> Fetching events..."
  });
},
于 2010-07-29T20:31:01.120 に答える
4

多分使ってみてくださいjQuery(this)

私はあなたを誤解したようです。与えられた例では、コンテキストによって「this」がjQueryオブジェクトを参照する場合があります。次のトリックを試してください。

function myCode() {
 var th = this;
 $.ajax( ... , th.getContextPath() ... );
}

//まあ、それはjQueryオブジェクトを参照します。これは、コードがonBeforeSendで呼び出されることを示すためにインデントを使用しないためです:(

于 2010-07-29T20:21:23.040 に答える
1

どのオブジェクトのgetContextPath()メソッドが必要ですか?

Google で簡単に検索すると、Javascript ではなく Java で使用できることが示されます。

于 2010-07-29T20:26:32.127 に答える
0

ヒント:Javascriptでの字句スコープに慣れておく必要があります

別のオブジェクト内にajaxを設定している場合は、試してみてください...

{
  //code
  var ObjectSelf = this;

  //refer to your object via ObjectSelf

}
于 2010-07-29T20:56:20.873 に答える
0

javascript でcallを使用して、カスタムオブジェクトを他の関数でこれとして送信できます

function SecondFunc() {
    alert(this.MyVar);
}
function FirstFunc() {
    var obj = {MyVar:"Test"}
    SecondFunc.call(obj);
}

体内で

<input type="button" onclick="FirstFunc()" value="test" />

イベントで FirstFunc() を呼び出すだけで、カスタム this で SecondFunc() が実行されます。

あなたの場合

function raiseSendRequest()
{
sendRequest.call(YourCustomObject);
}

function sendRequest()
{

jQuery.ajax({
  url: jQuery(formSel).attr("action"), 
  type: "POST", 
  data: jQuery(formSel).serialize(), 
  beforeSend: function(xhr) {
  jQuery(msgSel).hide();
  jQuery(msgSel).html("");
  jQuery(tableSel).hide();
  jQuery(pagerSel).hide();
  jQuery(cpSelector).block({
  message: "<img src='"+this.getContextPath()+"/images/icon_loading.gif' align='absmiddle' alt='Loading...' /> Fetching events..."
  });
}


これがうまくいくことを願っています

于 2010-07-29T20:50:21.497 に答える
0

これは束縛の問題です。これを jQuery メソッド内で呼び出すと、通常、タスクを実行している DOM または HTML 要素が参照されます。

で見ることをお勧めします

jQuery.proxy()

あなたの問題を解決します。

于 2010-07-29T21:16:42.830 に答える