这是我的主干观点:
View.ModelUploadView = Backbone.ItemView.extend({
template : modelUploadTpl,
events : {
"click a.js-updadeModel" : "updateModel",
},
initialize : function() {
_.bindAll(this, 'render');
this.model.bind('change', this.render);
this.listenTo(this, "model:update", this.render);
},
updateModel : function() {
this.trigger("model:update", this.model.get("id"));
},
当执行我的事件点击时,模型将被更新,因此我需要使用模型的新值渲染视图。
为此,我使用了监听器this.listenTo(this, "model:update", this.render);
,但它不起作用。每次我需要手动刷新页面以获取更新的模型。
任何解决方案???
答案 0 :(得分:0)
您很可能已经超载了 GET https://<host>.com/my_url
功能,或者在其他位置重新分配了Backbone View的 render
。
您唯一需要记住的是视图的事件被绑定到具体的el
。因此,如果为视图创建新的DOM node
(例如在渲染函数中),则需要手动调用Backbone.View.delegateEvents。
答案 1 :(得分:0)
Backbone中没有默认渲染,您必须为每个视图编写渲染。然后,您应该听取模型更改,例如(视图的内部初始化方法):
private int mViewState = 0;
@Override
public void onPause() {
super.onPause();
setViewState(mViewState & ~1);
}
@Override
public void onResume() {
super.onResume();
setViewState(mViewState | 1);
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
setViewState(mViewState);
}
private void setViewState(int newState) {
newState = getUserVisibleHint() ? newState | 2 : newState & ~2;
if (newState == 3 && mViewState != 3){
// I'm visible
}else if (newState != 3 && mViewState == 3) {
// I'm hidden
}
mViewState = newState;
}
每次模型属性更改并呈现视图时,都会触发更改事件。 在您的DOM事件处理程序中,您不必为模型触发更改事件,您只需使用this.model.set()来更改它的属性。
答案 2 :(得分:0)
你可以覆盖这样的render
函数。
View.ModelUploadView = Backbone.ItemView.extend({
template : modelUploadTpl,
events : {
"click a.js-updadeModel" : "updateModel",
},
initialize : function() {
_.bindAll(this, 'render');
this.model.bind('change', this.render);
this.listenTo(this, "model:update", this.render);
},
updateModel : function() {
this.trigger("model:update", this.model.get("id"));
},
render: function() {
this.$el.html(this.template(this.model.attributes));
return this;
}