gpt4 book ai didi

javascript - 与 Backbone 模型通信的 Backbone 集合

转载 作者:行者123 更新时间:2023-12-02 16:19:27 25 4
gpt4 key购买 nike

我试图了解在 Backbone 项目的不同组件之间进行通信的最佳实践是什么。我一直在重新实现 TodoMVC 的 Backbone 版本我的问题是从集合对象中删除模型。

据我所知,只要通过 .set() 修改任何模型属性,Backbone 模型实例就会触发更改事件。并且与模型实例关联的 View 应该 .listenTo()从模型实例更改,然后重新渲染。然而,模型和容纳它的集合对象之间通信的最佳实践是什么?例如,当模型从集合对象中删除时,通信应如何进行?

这是我的想法:当删除模型时,我认为模型实例应该发出集合对象正在监听的自定义事件并传递自身。当集合对象听到此事件时,它应该从列表中删除模型实例(以及附加到模型的任何事件监听器),然后整个集合对象应该重新呈现自身。然后,此重新渲染过程将创建一组新的模型和模型 View 。

这是最好的方法吗?我很想听听您的意见!对我来说,这个重新渲染的过程听起来非常昂贵,因为您必须销毁现有的 DOM 元素,删除它们的事件监听器,然后再次重新创建它们。

更新 - 2015 年 3 月 26 日

为了使这一点更加具体,我将包含迄今为止的代码,并指出我认为我的理解有偏差的地方。

文件结构

  1. 收藏

    a. todoList.coffee

  2. 模型

    a. todo.咖啡

  3. 观看次数

    a. todoView.coffee

    b. todoListView.coffee

  4. app.coffee

app.coffee

window.app = app = window.app || {} 

data = [
{
title: 'Eat dinner',
completed: false
}
{
title: 'Go to gym',
completed: true
}
]

app.todos = data.map (todo) -> new app.Todo todo

app.todoList = new app.TodoList app.todos

app.todoListView = new app.TodoListView
collection: app.todoList

app.$app = $('#todo-app')

$('#todo-app').append app.todoListView.render().el

todo.coffee

window.app = app = window.app || {}

app.Todo = Backbone.Model.extend
defaults:
title: ''
completed: false

toggleComplete: ->
this.set 'completed', !this.get 'completed'

todoList.coffee

window.app = app = window.app || {}

app.TodoList = Backbone.Collection.extend
model: app.Todo

initialize: () ->
# This is what I don't like - creating 'remove-todo' event
this.on 'remove-todo', this.removeTodoFromList

removeTodoFromList: (model) ->
this.remove model

getCompleted: ->
this.filter (model) -> model.completed

getNotCompleted: ->
this.filter (model) -> !model.completed

todoView.coffee

window.app = app = window.app || {}

app.TodoView = Backbone.View.extend
tagName: 'li'

events:
'click input' : 'checkComplete'
'click .delete' : 'removeTodo'

checkComplete: (e) ->
this.model.toggleComplete()

removeTodo: (e) ->
# I don't like how the collection is listening for this custom event 'remove-todo'
this.model.trigger 'remove-todo', this.model

initialize: ->
this.listenTo this.model, 'change:completed', () ->
this.render()

render: ->
template = _.template $('#todo-view').html()
this.$el.html template this.model.toJSON()
return this

todoListView.coffee

window.app = app = window.app || {}

app.TodoListView = Backbone.View.extend
tagName: 'ul'

className: 'todo-list'

initialize: ->
this.collection.on 'remove', (() ->
this.resetListView()
this.render()
), this

addOne: (model) ->
todoView = new app.TodoView
model: model

this.$el.append todoView.render().el

resetListView: ->
this.$el.html('')

render: ->
_.each this.collection.models, ((model) -> this.addOne model), this
return this

代码说明

正如您在上面的评论中看到的,每当单击删除按钮时,我的 todoView 都会触发自定义事件“remove-todo”。 todoList 集合监听此事件并从集合中删除特定模型。由于每当集合删除模型时都会触发“删除”事件,因此 todoListView 会监听此“删除”事件,然后重新渲染。我觉得我好像离开了某个地方。 有什么建议吗?

最佳答案

当你谈论模型时,你似乎在谈论 View 。当模型从集合中删除时,您不需要自定义事件,则会触发“删除”事件。 http://backbonejs.org/#Collection-remove

如果要删除相应的 View ,请使用 http://backbonejs.org/#View-remove这将管理 DOM 和监听器。

如果你听“从集合中删除”模型,就可以触发 View 的重新渲染(我不明白你在谈论重新渲染集合时在说什么),否则听http://backbonejs.org/#Collection-add ,或http://backbonejs.org/#Model-hasChanged您是否想在模型更改时重新渲染 View 。

希望对您有帮助。

关于javascript - 与 Backbone 模型通信的 Backbone 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29272626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com