0

ビューが初期化されると、作成された特定のビューにモデルをバインドするにはどうすればよいですか? ビューは、アプリケーションの開始時に現在初期化されています。また、モデルをコレクションにバインドするにはどうすればよいですか? (function ($) { //dom ですべてをロードします

//Creation, Edit, Deletion, Date
var Note = Backbone.Model.extend({
    defaults: {
        text: "write here...",
        done: false
    },

    initialize: function (){
        if(!this.get("text")){
            this.set({"text": this.default.text});
        }
    },

    edit: function (){
        this.save({done: !this.get("done")});
    },

    clear: function (){
        this.destroy();
    }
});

var NoteList = Backbone.Collection.extend({
    model:Note
});

var NoteView = Backbone.View.extend ({
    el: "body",

    initialize: function(){
        alert("initialized");
        var list = new NoteList;    
        return list;
    },

    events: {
        "click #lol" : "createNote"
    },

    createNote : function(){
        var note = new Note;
        this.push(note);
        alert("noted");
    }
});

var ninja = new NoteView;

})(jQuery);

4

2 に答える 2

1

アップデート

@James Woodruffの回答を見たところ、コードをもう一度見てみるようになりました。最初はよく見ていませんでしたが、まだ何を尋ねているのかわかりません。モデルまたはビューをリッスンして、他のイベントでトリガーされたイベントを処理する方法を尋ねている場合は、James の呼び出しの例をチェックして、ビューにモデルの(または) イベントをbind()リッスンさせます (ただし、代わりに使用することをお勧めします)の、使用している Backbone のバージョンによって異なります)。changechange:attron()bind()

しかし、あなたのコードをもう一度見て、答えを修正しました.

新しい答え

私がコメントを追加した、あなたの質問のコードは次のとおりです。

var NoteView = Backbone.View.extend ({

    // JMM: This doesn't make sense. You wouldn't normally pass `el`
    // to extend(). I think what you really mean here is
    // passing el : $( "body" )[0] to your constructor when you
    // instantiate the view, as there can only be one BODY element.

    el: "body",

    initialize: function(){
        alert("initialized");

        // JMM: the next 2 lines of code won't accomplish anything.
        // Your NoteList object will just disappear into thin air.
        // Probably what you want is one of the following:
        // this.collection = new NoteList;
        // this.list = new NoteList;
        // this.options.list = new NoteList;

        var list = new NoteList;    

        // Returning something from initialize() won't normally
        // have any effect.        

        return list;
    },

    events: {
        "click #lol" : "createNote"
    },

    createNote : function(){
        var note = new Note;

        // JMM: the way you have your code setup, `this` will be
        // your view object when createNote() is called. Depending
        // what variable you store the NoteList object in (see above),
        // you want something here like:
        // this.collection.push( note ).

        this.push(note);
        alert("noted");
    }
});

これは、私がコメントしたことへの変更を組み込んだコードの改訂版です。

var NoteView = Backbone.View.extend( {

  initialize : function () {

    this.collection = new NoteList;    

  },
  // initialize


  events : {

    "click #lol" : "createNote"

  },
  // events


  createNote : function () {

    this.collection.push( new Note );

    // Or, because you've set the `model` property of your
    // collection class, you can just pass in attrs.

    this.collection.push( {} );

  }
  // createNote

} );


var note = new NoteView( { el : $( "body" )[0] } );
于 2012-08-03T22:26:24.563 に答える