0

AJAX 呼び出しが成功したときにコールバック関数として updatePlays 関数が呼び出されるようにします。アンダースコア バインドを使用すると、実際に更新したい Collection オブジェクトとして 'this' を参照できると思っていましたが、ここで問題が発生しました。コレクションを更新する関数にたどり着くと、「this」は「window」を参照していると考えられます。

この場合、バックボーン モデルには、別のバックボーン モデルから作成されたバックボーン コレクションがあります。

ビューで:

SomeView: Backbone.View.extend({
  someFunction: function(e) {
    var field = this
    this.picker = new PlayPicker({
      field:field,
      model: new PlaySet({
        plays: new Collections.Plays({}),
        slot: field.model
      })
    })
  }
}) 

PlayPicker:Backbone.View.extend({
 ...
  refresh: function () {
    this.model.update()
  },
....

モデル PlaySet の一部であるコレクション

Plays:Backbone.Collection.extend({
  model: Play ,
  initialize: function () {
    plays = this
    _.bind(this.updatePlays, plays) // Where I thought I should bind
  },
  updatePlays: function (plays) {
    new_plays = []

    var i; 
    for (i = 0; i < plays.length; i++){
      new_plays.push(new Play({
        id: plays[i]["id"],
        text: plays[i]["text"]
      }));
    }

    this.reset(new_plays) // Uncaught TypeError: Object [object Window] has no method 'reset' 
  }
})

モデルプレイセット

PlaySet: Backbone.Model.extend({
  update: function() {
    this.get('slot').fetchAssociatedPlays(this.get('plays').updatePlays)
  },
})

モデル スロット - AJAX 呼び出しを行います

Slot:Backbone.Model.extend({

  ...

  fetchAssociatedPlays: function(update) {
    thisModel = this
    $.ajax({
      url: thisModel.associatedPlaysURL(),
      success: function (collection) {
        update(collection)
      }
    })
  }})

これはアンダースコアバインドで達成できるはずですか?どこで/どのように正しい方法になりますか?

前もって感謝します。

4

1 に答える 1

0

この質問への回答は、私の問題を解決するのに役立ちました: Backbone.jsとUnderscore.jsでコールバックをバインドする

callBack = _.bind(callBack, this);

最初の関数を何らかのオブジェクトにバインドした結果である関数を使用する必要があるということでした。

于 2012-11-26T18:20:26.920 に答える