【发布时间】:2015-04-02 22:49:19
【问题描述】:
我刚刚意识到,当谈到骨干时,我不知道自己到底在做什么。当我试图找出一个有说服力的策略来删除模型上的视图事件侦听器时,我意识到了这一点。然后我问“好吧,既然视图已经渲染到 DOM,那么模型在哪里?”然后我问“我在函数体内创建的这个模型对象如何,因此现在我已经将视图渲染到 DOM 并保持状态,因此超出了范围?” 啊啊啊啊!!!!!!!!!
例如。
视图构造函数
Timeclock.Views.JobNewView = Backbone.View.extend({
template: JST['jobs/_form'],
events:{
'blur #job_form :input':'assignValue'
},
initialize: function(options){
this.listenTo(this.model, 'failed-request', this.failedLocationRequest);
this.listenTo(this.model, 'updated-location', this.updatedLocation);
this.listenTo(this.model, 'sync', this.renderJobView);
this.listenTo(this.model, 'invalid', this.displayModelErrors);
this.listenTo($(window), 'hashchange', this.clearListeners);
},
render: function(){
this.$el.html(this.template({attributes: this.model.attributes}));
this.$el.find('#address_fields').listenForAutoFill();
return this;
},
assignValue: function(e){
var $field = $(e.currentTarget)
var attr_name = $field.attr('name');
var value = $field.val();
this.model.set(attr_name, value);
}...
});
函数渲染视图到 DOM
renderCollaboratingView: function(e){
var job = this.model;
var $row = $(e.currentTarget);
job.set({customer_id: $row.data('id')});
var model_view = new this.ViewConstructor({model: job});
$container.html(model_view.render().el);
}
那么我传递给视图对象的模型如何持久化,以便 DOM 交互可以在底层模型对象上设置属性值?
我知道主干视图只是以声明方式编写 DOM 侦听器的包装器,但在上面的示例中,DOM 事件如何作用于底层模型对象?当 renderCollaboratingView() 函数退出后,我传递给视图的模型如何仍在交互?
我可以想到两种方法:
1) 模型对象通过 jquery 对象绑定到 DOM。我在视图中声明的所有事件侦听器都知道底层模型对象在 jquery 对象上的位置(“模型”属性?)。
2) Backbone 正在创建一些对象命名空间,视图知道它在哪里存储支持 DOM 的模型和集合。我感觉它是第一名,但谁知道呢。
再一次,我来到这里是因为我试图理解为什么我需要删除我首先传递到视图中的模型上的侦听器。如果主干视图实际上只是 jquery 对象,那么当支持 jquery 对象的元素从 DOM 中删除时,jquery 侦听器是否不会从 DOM 元素中删除?如果我不打算完全破坏视图并保存以供以后使用,我是否只需要删除侦听器?
我们将不胜感激任何可以提供的帮助。面临生存危机。
谢谢
【问题讨论】:
-
您使用的其他语言是什么?与c不同,c++在js上有垃圾收集,当没有人指向它们时会被收集。
标签: javascript jquery backbone.js backbone-views backbone-events