2016-11-30 13 views
-1

コードにはdivが複数あります。 APIリクエストに基づいて、内部のhtmlを更新する必要があります。 htmlは機能しますが、htmlは更新されません(つまり、APIを使用して新しい結果を取得した場合、htmlは最初の反復と同じですが、Firebugでは新しいHTMLをページに挿入する準備ができています)。Ajax:setInterval関数はhtmlを更新しません(ただし動作​​します)

setInterval(function(){getGpioState(id_gpio,$(this))}.bind(this), 5000); 

またはあなたが好きそれを修正することができ、変数に$(this)を割り当てるとするsetInterval関数内

+0

なぜあなたは、あなたの成功のコールバックでの障害のためにテストしていますか?なぜ結果を受け入れ、それをどこに注入して2番目のエラーコールバックを設定するのはなぜですか? –

+0

[この "キーワード"はどのように機能しますか?]の複製がありますか?(http://stackoverflow.com/questions/3127429/how-does-the-this-keyword-work) –

答えて

1

変更この

setInterval(function(){getGpioState(id_gpio,$(this))}, 5000); 

setInterval((function(_this){ 
    return function(){ 
    getGpioState(id_gpio,$(_this)); 
    }; 
}(this)), 5000); 

問題は、scopethisのキーワードがJavaScriptでどのように機能するかに関連しています。

それともあなたも、単純に変数を使用することができます。

$('div.show-gpio-state').each(function(i, obj) { 
    var id_gpio = $(this).data('id-gpio'); 
    var $this = $(this); 
    getGpioState(id_gpio,$this); 
    setInterval(function(){getGpioState(id_gpio,$this)}, 5000); 
}); 

あなたがこの記事を読むことができる問題についての詳細を学ぶために:Understand JavaScript’s “this” With Clarity, and Master It

+1

作業の理由は、 'this'は' setInterval'の内部で独自のスコープを持つ新しい関数を定義するためです。したがって、 'this'は' each'関数の代わりに 'setInterval'関数を参照します – empiric

1

を渡すために

$('div.show-gpio-state').each(function(i, obj) { 
     var id_gpio = $(this).data('id-gpio'); 
     getGpioState(id_gpio,$(this)); 
     setInterval(function(){getGpioState(id_gpio,$(this))}, 5000); 
    }); 

function getGpioState(id_gpio,box) { 

    $.ajax(
      { url: api_gpio_url+id_gpio, 
       cache:false, 
       success: function (result) { 
        box.html(''); 
        var state = result; 
        var final_state = ''; 
        if ((state==='error') || (state==='')) { 
         final_state = '<span class="text-danger"><i class="fa fa-fw fa-2x fa-exclamation-triangle"></i></span>'; 
        } else { 
         if (state==1) { 
          final_state = '<p class="h2"><i class="fa fa-fire text-success"></i></p>'; 
         } else { 
          final_state = '<p class="h2"><i class="fa fa-remove text-grey"></i></p>'; 
         } 
        } 
       box.html(''); 
       box.html(final_state); 
       // here in console I have right final state for right box 
       console.log(final_state); 
       console.log(box); 

      } 
     }); 

} 
関連する問題