2011-07-14 18 views
36

Soy un novato de Backbone.js. Solo estaba jugando con eso. Me gustaría saber si el modelo está relacionado con la Vista. En el ejemplo proporcionado todos, veo en el método addOne, se crea una nueva Vista y se asocia con el modelo recién creado y se agrega.Backbone.js Modelo para ver la conexión

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

Cuando traté de hacer algo similar, que tiene un error que dice "método de enlace no se puede encontrar en indefinido".

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; 
    } 
}); 

Para solucionar esto, tiene que pasar el modelo recién creado como un parámetro a la vista constructor y que tiene que ver this.model = task finde para asociarlo.

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(''); 
} 

});

Pero el ejemplo de todos, no tiene algo así. ¿Cómo está el nuevo modelo asociado con la nueva vista implícitamente en el ejemplo de todos?

Gracias

+0

¿Dónde tienes 'Task' constructor? –

+0

En su llamada a 'this.model.bind', necesita pasar el contexto correcto. El modelo usa 'this' en su contexto, por lo que necesita decirle que represente la vista y no a sí mismo. 'this.model.bind ('change', this.render, this);' –

Respuesta

37

¡No es implícita en absoluto, es explícito en esta línea aquí:

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

Esto está creando un nuevo TodoView vista y estableciendo su propiedad model al único parámetro de la función addOne (todo , que es un modelo).

Cada vez que se agrega un nuevo modelo a la colección Todos, se llama al método addOne con el nuevo modelo como parámetro.

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

Luego, en addOne, se crea un nuevo punto de vista para ese modelo y la relación se establece explícitamente, a través de {model: todo}. Esto es lo que te estás perdiendo de tu versión del código, sospecho.

Lo que parece que estás intentando hacer es vincular la vista y el modelo en la función de inicio de la vista, y eso está bien, pero estás solo si lo haces, lo que significa que debes configurar el modelo < -> vea usted mismo la relación (que ha resuelto pasando el modelo como parámetro a la función de inicio de vista).

+0

Cuando traté de establecer como {model: todo}, recibí un error de que bind no está definido para el cambio. Básicamente, lo que se pasa es una Objeto normal sin esqueleto. Métodos específicos del modelo :( – felix

+0

Donde configuras '{model: todo}', no has mostrado ese bit de tu código. ¿Estás seguro de que la variable 'todo' no es nula en ese contexto? –

+0

He actualizado la pregunta con el fragmento de código donde se creó la nueva vista de tareas. No, no era nulo, era un objeto común. – felix

Cuestiones relacionadas