2

我一直在学习很多关于骨干,骨干关系和通过stackexchange构建web应用的建议 - 所以首先感谢社区。View +骨干/骨干关系应用中的子视图

现在,我坚持试图理解这个当前涉及嵌套模型和子视图的问题,在我看来是一个非常常见的用例。

我试图扩展这个tutorial,通过keepin跟踪每个葡萄酒的“CheckIns”来了解骨干关系,视图/子视图和事件处理。

我已经扩展了服务器端返回的签入适当的JSON和骨干关系模型,如下所示:

window.CheckInModel = Backbone.RelationalModel.extend({ 
    defaults:{ 
     "_id":null, 
     "Did":"true", 
     "dateOf":"", 
     } 
}); 

window.CheckInCollection = Backbone.Collection.extend({ 
    model : CheckInModel 
}); 

,酒型号,像这样:

relations: [{ 
type: Backbone.HasMany, 
key:'CheckIn', 
relatedModel: 'CheckInModel', 
collectionType: CheckInCollection, 
    }] 

我已经创建了一个CheckInListView和CheckInItemView(与WineListView和WineListItemView相同),并使用WineView Render函数渲染CheckIns,如下所示:

render:function (eventName) { 
    console.log("wine View Render"); 
    $(this.el).html(this.template(this.model.toJSON())); 

    this.myCheckInListView = new CheckInListView({model: this.model.attributes.CheckIn}); 
    this.$el.append(this.myCheckInListView.render().el); 
    return this; 
}, 

我还创建签入wineview内创建一个新的功能,并与给定事件关联:

logcheckin: function (event){ 
    var todate = new Date(); 
    newCheckIn = new CheckInModel ({'Did':"true", 'dateOf': todate.toISOString()}); 
    console.log ("Logcheckin - About to push newCheckIn onto Model."); 
    this.model.attributes.CheckIn.push (newCheckIn); 
    console.log ("Just pushed newCheckIn onto Model."); 
    this.saveWine(); 

}

好 - 如果你还没有TL/DRED尚未 - 这一切似乎从用户界面的角度来看工作很好-ie。一切正确呈现并保存到Db。

但我注意到在控制台中,当我推入一个新的CheckIn(在上面的console.logs之间)时,CheckInListView的Add绑定会被多次调用,用于wach按钮按下 - 这让我觉得我的一些错误做观点或者我不了解事件传播的基本原理。

这是怎么发生的?它预期的行为?我正在接近我想要做的事吗?

感谢您阅读,如果不是你的帮助。

==

下面是绑定到add(及其他)事件CheckinListView和CheckInList项目意见的相关部分。

window.CheckInListView = Backbone.View.extend({ 

     initialize:function() { 
     this.model.bind("reset", this.render, this); 
     this.model.bind("change", this.render, this); 
     var self = this; 
     this.model.bind("add", function (CheckIn) { 
      console.log ("Adding to CheckInListView - a CheckIn List Item", CheckIn); 
      self.$el.append(new CheckInListItemView({model:CheckIn}).render().el); 
     }); 
    }, 


     close:function() { 
     $(this.el).unbind(); 
     $(this.el).remove(); 
    } 
}); 

window.CheckInListItemView = Backbone.View.extend({ 

    initialize:function() { 
     this.model.bind("change", this.render, this); 
     this.model.bind("destroy", this.close, this); 
    }, 

}); 

=========================================== ===

关于事件绑定和关闭视图的评论是调试这个的正确提示。

1)我没有关闭,并留下一些鬼事件消费者即使有没有在DOM

2妥善解除绑定嵌套视图),你只需要绑定事件,如果我们想要做的事只有在子视图。
例如 - 如果我有子视图中的复选框,我可以在主视图中绑定子视图更改事件并处理那里的事件,因为主视图有模型。我不知道这是否是“正确”的方式,但它适用于我需要做的事情。 (毫米..意大利面条代码味道很好)

3)在这方面挣扎着帮助我更多地思考UX,并帮助我简化UI。

4)我试图通过将所有数据嵌套到JSON调用中来“保存”对服务器的调用。如果我要重新执行此操作 - 我根本不会嵌套数据,而是在后端处理它,方法是将wine ID与checkIn ID相关联,然后在选择任务后拥有一个单独的集合,并将集合填充到集合中 - 我认为这不是首选的方式,但它似乎是很多人的方式。

仍然欢迎高于或“正确”的方式问题的任何想法,如果任何人都可以指向超越“简单骨干应用”

+0

当你说'CheckInListView的添加绑定'时,你绑定了什么实际事件? –

回答

1

我不知道这是发生一切的教程,但是,我我们遇到过多次事件发生的问题。如果您使用相同的视图呈现多个模型,则有可能它们都被绑定到相同的事件。

也许这个答案可能适用: Cleaning views with backbone.js?

如果没有,你应该爱德华史密斯中号的评论作出回应,并显示您的活动是如何被约束。

+0

清理视图帖子很有意义,当我将视图作为路由器的一部分进行更改时,我正在关闭WineView。我试图保持代码只是相关的部分,以保持可读性,但如果会有所帮助,我可以将它完全放在小提琴中。 – honeybadger