2016-05-04 12 views
0

私はそれをダブルクリックすると、それを編集をユーザーに許可するコンテンツのセクションを持っています。ユーザーがコンテンツを変更してから2秒間停止すると、更新されたコンテンツがサーバーに送信されて保存されます。置き換えタイムアウトイベントが発生2回以上(時には)

これを行うには、2秒カウントダウンを開始するセクションにinputイベントリスナーをバインドしました。カウントダウンが既に存在する場合は、前者がキャンセルされ、代わりに新しいイベントが開始されます。カウントダウンの最後に、http POST要求が新しいデータとともにサーバーに送信されます。

問題は時としてカウントダウンの終了時に、私はカウントダウンが新しいものが挿入される前にキャンセルされなかった、と私はその理由を把握することはできませんかのように、送信された2つの以上の要求を参照してくださいということです。次のように

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

//this function is bound to a double-click event on an element 
function makeEditable(elem, attr) { 

    //holder for the timeout promise 
    var toSaveTimeout = undefined; 

    elem.attr("contentEditable", "true"); 
    elem.on("input", function() { 

     //if a countdown is already in place, cancel it 
     if(toSaveTimeout) { 
      //I am worried that sometimes this line is skipped from some reason 
      $timeout.cancel(toSaveTimeout); 
     } 
     toSaveTimeout = $timeout(function() { 
      //The following console line will sometimes appear twice in a row, only miliseconds apart 
      console.log("Sending a save. Time: " + Date.now()); 
      $http({ 
       url: "/", 
       method: "POST", 
       data: { 
        action: "edit_content", 
        section: attr.afeContentBox, 
        content: elem.html() 
       } 
      }).then(function (res) { 
       $rootScope.data = "Saved"; 
      }, function (res) { 
       $rootScope.data = "Error while saving"; 
      }); 
     }, 2000); 
    }); 

    //The following functions will stop the above behaviour if the user clicks anywhere else on the page 
    angular.element(document).on("click", function() { 
     unmakeEditable(elem); 
     angular.element(document).off("click"); 
     elem.off("click"); 
    }); 
    elem.on("click", function (e) { 
     e.stopPropagation(); 
    }); 
} 
+0

あなたが参照するには、 '場合(toSaveTimeout){' 'ブロックにconsole.log'を追加しようとしましたもしそれが入っていたら? – IMTheNachoMan

+1

'makeEditable'関数を呼び出すたびに、toSaveTimeoutはこの関数スコープにバインドされているため、未定義です。あなたのテスト 'if(toSaveTimeout)'は常に失敗します。 – Franck

+0

あなたは 'makeEditable'を2回呼び出さないようにしてください。 –

答えて

1

は機能makeEditableが複数回呼び出されたこと(上記のコメンテーターからの助けを借りて)をオンにします。関数の先頭に次の2行のコードを追加する

は、問題を修正しました:

//if element is already editable - ignore 
if(elem.attr("contentEditable") === "true") 
    return; 
+0

なぜ/どのように 'makeEditable'が2回呼び出されたのか知っていますか?とにかくそれを停止/修正するので、すでに呼び出されているかどうかをチェックするのではなく、2回呼び出されることはありませんか?私は両方の仕事を意味しますが、私はそのソースでそれを停止する方が良いと感じています。 – IMTheNachoMan

+0

(回答を回答としてマークすることもできます) – IMTheNachoMan

+1

このようなことが起こる理由は数多くあります。マウスのクリックを複数回送信するようなハードウェアの問題でも可能です。しかし、その理由の1つは、ユーザーが再度原因をダブルクリックすることです(おそらく、コンセプトを理解していないか、またはこれが保存する方法だと思ったかもしれません)。そして、そのシナリオで浮上する問題を防ぐ唯一の方法は、上のコード行。 (そしてはい、私は行いますが、自分の答えを受け入れる前に24時間前に状態を規定します) –

関連する問題