web-dev-qa-db-ja.com

接続を表示するBackbone.jsモデル

私はBackbone.jsの初心者です。私はそれで遊んでいた。モデルがビューに関連しているかどうかを知りたいです。提供されている todos の例では、addOneメソッドに新しいビューが作成され、新しく作成されたモデルに関連付けられて追加されています。

  window.AppView = Backbone.View.extend({
     // view code
     addOne: function(todo) {
          var view = new TodoView({model: todo});
          this.$("#todo-list").append(view.render().el);
     }
  }

同様のことをしようとすると、「バインドされたメソッドが未定義で見つからない」というエラーが表示されました。

window.TodoView = Backbone.View.extend({

     initialize: function() {
          _.bindAll(this, 'render', 'close');
          this.model.bind('change', this.render); // I got the error at this place. 
          this.model.view = this;
     }
});

これを解決するために、新しく作成したモデルをパラメーターとしてビューコンストラクターに渡し、this.model = taskそれを関連付けるため。

window.TodoView = Backbone.View.extend({

     initialize: function(task) {
          _.bindAll(this, 'render', 'close');
          this.model = task
          this.model.bind('change', this.render);// now there is no error
          this.model.view = this;
     }
});

window.AppView = Backbone.View.extend({


   insertTask:function(){
        var newTask, newTaskView;
        newTask = new Task(JSON.parse(xhr));
        Tasks.create(newTask);
        newTaskView = new TaskView({ model: newTask });
        $("#todo_list").append(newTaskView.render().el);
        this.input.val('');
}

});

しかし、todosの例では、そのようなものはありません。新しいモデルは、todosの例で暗黙的に新しいビューにどのように関連付けられていますか?

ありがとう

36
felix

暗黙的ではありません。この行で明示的です:

var view = new TodoView({model: todo});

これは、新しいTodoViewビューを作成し、そのmodelプロパティをaddOne関数の唯一のパラメーター(モデルであるtodo)に設定しています。

新しいモデルがTodosコレクションに追加されるたびに、addOneメソッドが新しいモデルをパラメーターとして呼び出されます。

Todos.bind('add', this.addOne);

次に、addOneで、そのモデルの新しいビューが作成され、{model: todo}を介して関係が明示的に設定されます。これは、コードのバージョンに欠けているものです。

あなたがしようとしているように見えるのは、ビューの初期化関数でビューとモデルをリンクすることです、それは問題ありませんが、それを行う場合は自分で行います-つまり、モデルをセットアップする必要があります<->関係を自分で表示します(モデルをパラメーターとしてview init関数に渡すことで解決しました)。

38
Factor Mystic