Jim*_*ers 7 javascript model-view-controller coffeescript backbone.js
我有一个路由器访问其集合.我的for循环没有遍历模型,所以我尝试记录集合以查看它返回的内容.当我直接记录集合时,我看到了所有模型.但是如果我尝试记录集合的models属性,我会得到一个空数组!这没有意义.这些线直接相互跟随.我尝试改变顺序并获得相同的结果.
console.log(this.collection);
=> Shots
_byCid: Object
_byId: Object
length: 15
models: Array[15]
__proto__: Shots
...
console.log(this.collection.models);
=> []
console.log(this.collection.length);
=> 0
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
以下是路由器中的代码,以便更好地了解此代码触发的位置:
# Routers
class Draft.Routers.Shots extends Backbone.Router
routes:
'' : 'index'
'shots/:id' : 'show'
initialize: ->
@collection = new Draft.Collections.Shots()
@collection.fetch()
index: ->
console.log @collection
console.log @collection.models
Run Code Online (Sandbox Code Playgroud)
吉姆
这不能解决你的问题 - 你已经解决了这个问题.但它解释了为什么你看到你看到的控制台输出.
当您运行console.log(this)时,您输出对象本身,并且控制台将引用(如果您喜欢的指针)链接到内部变量.
当您在控制台中查看它时,在console.log(this)运行时,模型区域为空,但是当您查看日志时,集合已完成加载模型和内部数组变量已更新,并且对象日志中对该变量的引用显示当前内容.
基本上在console.log(this)中,内部模型变量继续其正常生活,控制台在您查看它时显示当前状态,而不是在您调用它时.使用console.log(this.models),数组按原样转储,不保留引用,并逐个转储所有内部值.
这种行为很容易通过短暂的超时重现,看到这个小提琴.. http://jsfiddle.net/bendog/XVkHW/
我发现我需要监听集合来重置。因此,我没有将模型传递到视图中,而是创建了另一个需要集合的视图,并监听“重置”事件以触发视图的“渲染”。
# Routers
class Draft.Routers.Shots extends Backbone.Router
routes:
'' : 'index'
'shots/:id' : 'show'
initialize: ->
@collection = new Draft.Collections.Shots()
@collection.fetch()
index: ->
view = new Draft.Views.Desktop(collection: @collection)
# Views
class Draft.Views.Desktop extends Backbone.View
el: $("body")
initialize: ->
@collection.on("reset",@render,this)
render: ->
console.log @collection
console.log @collection.length
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3512 次 |
| 最近记录: |