0

これはスコーピングの問題だと確信していますが、モデルをデータベースに保存する前に確認を求めるために Bootbox (twitter の Bootstrap を拡張する小さなライブラリ) を使用しているバックボーン ビューがあります。ビューは、SAVE ボタンのクリックをキャッチする役割を果たします。その時点で、Bootbox ダイアログがポップアップし、確認を求めるプロンプトが表示されるはずです。下記参照:

    window.StartView = Backbone.View.extend({

    initialize: function () {
        this.render();
    },  

    events: {
        "click .nextstage"   : "nextstage",
        "click .reshuffle"   : "render",
        "click .drilldone"   : "drilldone"
    },  

    drilldone: function() {

      bootbox.confirm("Record Results?", function(result) {

      result ? this.saveResults : alert("canceled") ;

    }); 

    },

問題は this.saveResults が実行されないことです。その代わりに「alert(this)」を実行しようとしたところ、メインの HTML ドキュメントで Bootbox ライブラリが定義されているため、意味のある「Window」が返されました。では、Bootbox 呼び出しを取得してから、View の saveResults メソッドへのコールバックを行うにはどうすればよいでしょうか? メソッドへの参照を Bootbox の確認メソッドに渡す必要があります。

4

2 に答える 2

1

コンテキストを変数にスコープして、関数を呼び出すだけです。(括弧()がないと実行されません)

drilldone: function() {
    var self = this;

    bootbox.confirm("Record Results?", function(result) {

        result ? self.saveResults() : alert("canceled") ;

    }); 

},

Javascript は、スコープ チェーンを使用して、特定の関数のスコープを確立します。関数を作成するときは、新しいスコープを作成します。このスコープは、内部で宣言されたすべての変数と、その親で宣言されたすべての変数にアクセスできます (グローバル スコープまでずっと続くスコープ チェーンと考えてください)。

設定がない場合は、オブジェクトthisthisなりglobalます(windowブラウザ内)。またはを使用して、this関数内の の値を動的に変更できます。これは、ほとんどのコールバックで jQuery が行っていることです (これが、window であると考えた理由かもしれませんが、それとは関係ありません)。callapplybindthis

を割り当てることで、ブートボックス コールバック スコープで使用可能なオブジェクトvar self = thisへの参照を変数として保持しました。this

これは非常に簡単な概要です。この他のスタックオーバーフローの回答を読むことに興味があるかもしれません: JavaScript の変数のスコープは何ですか?

JavaScript Enlightmentという無料の本もあり、この件に触れています。

于 2013-09-09T21:38:47.557 に答える
0

私はバックボーンを使用したことがありませんが、これはバックボーン固有ではなく、あなたが示唆しているようにスコープの問題です。私は試してみたい:

window.StartView = Backbone.View.extend({

  initialize: function () {
      this.render();
  },  

  events: {
      "click .nextstage"   : "nextstage",
      "click .reshuffle"   : "render",
      "click .drilldone"   : "drilldone"
  },  

  drilldone: function() {
    var ctx = this;
    bootbox.confirm("Record Results?", function(result) {
    result ? ctx.saveResults : alert("canceled") ;
  }); 
},

これを再割り当てすると少しメモリ リークが発生するため、これはやや最適ではありませんが、影響は無視できる可能性が高くなります。

于 2013-09-09T21:40:21.197 に答える