2012-07-03 3 views
0

У меня есть два модуля itemView.js и ListView.js.
Все работает, когда я извлекаю данные.События между Marionette.CompositeView и Marionette.ItemView

Проблема в том, что касается item view (1), когда я меняю соответствующую модель.

а) ListView.js (2) отображает все объекты, которые модели имеют closed значение, равное false (3)

б) действие closeTask в (1) изменяет значение модели
от closed: false к closed: true

с) если б) происходит изменение ничего,
, но если я перезагрузить страницу я получаю не отображается правильные результаты (модель, имеющий значение, равное closedtrue).

Как исправить эту проблему?


(1)

// itemView.js 
var itemView = Marionette.ItemView.extend({ 

    initialize: function() { 
     this.model.on('change', this.render, this); 
    }, 

    events: { 
     'click #close': 'closeTask' 
    }, 

    template: itemTemplate, 

    tagName: 'li', 

    closeTask: function() { 
     if (!this.model.get('closed')) { 
      this.model.save({ 
       closed: true 
      }); 
     } 
    } 

}); 

(2)

// ListView.js 
var ListView = Marionette.CompositeView.extend({ 

    template: listTemplate, 

    itemView: itemView 

}); 

(3)

// Collection 
myCollection.attributes = [ 
    { 
     id: 1, 
     name: 'bar' 
     closed: false 
    }, 
    { 
     id: 2, 
     name: 'bar2' 
     closed: false 
    }, 
    …. 
]; 

P.S .:

Когда я принести коллекции, сервер дает мне только те модели, которые имеют закрытый атрибут, равный ложным.

app.addInitializer(function() { 
    myCollection = new MyCollection(); 
    myCollection.fetch(); 
}); 
+0

Что вы ожидаете этого? какое изменение вы ожидаете увидеть, когда элемент закрыт? –

ответ

1

Я не работал с марионетками, но я работал с Backbone, моя мысль в том, что марионетка не освежает шаблон или что-то вроде этого.

Что произойдет, если вы попробуете это?

// itemView.js 
var itemView = Marionette.ItemView.extend({ 

    initialize: function() { 
     this.model.on('change', this.render, this); 
    }, 

    onRender : function(){ 
     //verify your model: 
     console.log(this.model.toJSON()); 
     if (this.model.get('closed')) { 
      this.$el.fadeOut();//bye bye item 
     } 
    }, 

    events: { 
     'click #close': 'closeTask' 
    }, 

    template: itemTemplate, 

    tagName: 'li', 

    closeTask: function() { 
     if (!this.model.get('closed')) { 
      this.model.save({ 
       closed: true 
      }); 
     } 
    } 

}); 
+0

Я обновил свой код, чтобы использовать onRender, поскольку у Marionnet есть один метод для него. https://github.com/derickbailey/backbone.marionette/blob/master/docs/marionette.itemview.md –

+0

+1 да, ваш код работает. В любом случае марионетка должна повторно отобразить это изменение автоматически или, может быть, я что-то пропустил. –

+0

Возможно, вам что-то не хватает, вставьте мне пожалуйста код, в котором вы решите показать или нет элемент, зависящий от значения закрытого. –