更新:问题解决,案件结案。
我仍然无法让我的一部分代码工作。
我的视图现在监听集合以获取更新,应该发生的是:
- ListView 监听结果集合
- 结果已同步
- ListView 为每个 Result 创建一个 ItemView
- ListView (ul) 附加每个 ItemView (li)
一切似乎都很好,直到最后一步。
ListView 中应该将结果添加到列表的函数无权访问 ListView 的元素。
我可以创建一个 ItemView,并检索它的元素“ ”,但不能在函数中引用<li>
ListView 的“ ”。<ul>
ListView 中的示例代码位:
el: $('.result-list'),
initialize: function() {
this.listenTo(this.collection, 'add', this.addOne);
},
addOne: function(result) {
view = new ItemView({ model: result });
this.$el.append(view.render().el);
},
在上面的代码中,变量 view 存在,它的元素也存在,但是“this”不再引用 ListView。
下面的问题解决了
我想要完成的是让视图模块(搜索)能够触发集合(结果)中的事件。
当 Search View 被提交时,它应该将输入字段传递给 Collection 的 fetch 方法以从服务器检索结果。目前,我可以从 View 触发一个函数,但该函数无法访问 Collection 的任何方法。
以前,我让 View/Collection 通过它们的变量名直接相互引用。
由于我已将代码分成模块,因此视图/集合无法再直接相互访问。
这是一些代码:(用Coffeescript编写)
app.coffee - global_dispatcher 应用于 Backbone
define [
'jquery'
'underscore'
'backbone'
'cs!router'
], ($, _, Backbone, Router) ->
# global_dispatcher added to all Backbone Collection, Model, View and Router classes
dispatcher = _.extend {}, Backbone.Events, cid: 'dispatcher'
_.each [ Backbone.Collection::, Backbone.Model::, Backbone.View::, Backbone.Router:: ], (proto) ->
_.extend proto, global_dispatcher: dispatcher
new Router()
router.coffee - 这是我遇到麻烦的地方。'getResults' 的函数已触发,但无法从此处访问集合 'results'。
define [
'backbone'
'cs!views/resuls/list'
'cs!views/results/search'
'cs!collections/results'
], (Backbone, ListView, SearchView, Results) ->
Backbone.Router.extend
routes:
# URL routes
'': 'index'
index: ->
results = new Results
new ListView { model: results }
new SearchView
@global_dispatcher.bind 'getResults', (data) ->
console.log results
search.coffee - 查看哪个触发了事件,它将成功触发事件并传递正确的参数。
define [
'jquery'
'backbone'
], ($, Backbone) ->
Backbone.View.extend
events:
'submit #search-form': 'submit'
submit: (evt) ->
evt.preventDefault()
phrase = @.$('input').val()
@.$('input').val('')
args = name: phrase
@global_dispatcher.trigger 'getResults', args