【发布时间】:2013-07-09 15:47:52
【问题描述】:
我在重新渲染主干中的简单集合时遇到问题,渲染事件永远不会从侦听器中触发...我不确定错误在哪里,请有人帮助我吗?
模型文件:
window.MetricDevice = Backbone.Model.extend({
defaults: {
ip: null,
framesReceived: null,
framesOutOfOrder: null,
framesLost: null
}
});
window.MetricDevicesCollection = Backbone.Collection.extend({
model: MetricDevice,
value: null,
url: function(){
return hackBase + "/wm/iptv/metric/devices/json";
},
initialize:function () {
this.fetch({ reset: true });
console.log("data fetched");
},
});
渲染页面:
window.MetricItemView = Backbone.View.extend({
events: {
"click input[type=button]" : "removeDevice",
},
initialize:function(){
this.template = _.template(tpl.get('metric-devices-item'));
this.render();
},
removeDevice:function(){
$.ajax({
url:hackBase + '/wm/iptv/metric/disable/' + this.model.get("ip") + '/0/json',
dataType:"json",
success:function (data) {
if ( data.return == 1 ){
alert(data.error);
}else{
alert("Metric disabled in " + this.model.get("ip"));
}
},
});
},
render:function(){
var ip = this.model.get("ip");
console.log("rendering item in view " + ip);
},
});
window.MetricView = Backbone.View.extend({
events: {
"click input[type=button]" : "add",
"click input[type=img]" : "updateAll",
},
clicked:function(e){
},
updateAll:function(e){
this.render();
},
initialize:function () {
this.template = _.template(tpl.get('metric-devices-list'));
this.model.bind("change", function(){
console.log("metricView data change detected");
this.render();
});
this.model.bind("reset", this.render());
},
add:function(e){
if($(e.currentTarget).attr("name") == "add" ){
var ip = document.getElementById('vaddress').value;
var threshold = document.getElementById('vthreshold').value;
$.ajax({
url:hackBase + '/wm/iptv/metric/enable/' + ip + '/' + threshold + '/json',
dataType:"json",
success:function (data) {
if ( data.return == 1 ){
alert(data.error);
}else{
alert("Metric enabled in device");
}
},
});
}else if($(e.currentTarget).attr("name") == "cancel"){
document.getElementById('vaddress').value = "";
document.getElementById('vthreshold').value = "";
}
},
render:function (eventName) {
$(this.el).html(this.template());
var list = $(this.el).find('#tableData');
console.log("On render!");
var subviews = [];
console.log("looping on models");
_.each(this.model.models, function (sw) {
console.log("model loop " + sw.get("ip"));
var m = new MetricItemView({model:sw, tagName: 'tbody', el: $(this.el).find('#tableData')});
list.append(m.template(sw.toJSON()));
}, this);
return this;
},
});
问题是 MetricView 中的 render 方法在页面第一次加载时被调用,之后我的印象是 JSON 保持缓存,如果我关闭浏览器干净,内容就会改变缓存并再次运行...
控制台输出为:
On render! metricView.js:86
looping on models metricView.js:88
model loop 10.0.0.1 metricView.js:92
rendering item in view 10.0.0.1 metricView.js:26
我正在像这样实例化 MetricView
var metricdevices = new MetricDevicesCollection();
$('#content').html(new MetricView({model:metricdevices}).render().el);
我是不是忘记了什么?
【问题讨论】:
-
你的控制台有错误吗?
-
不只是调试消息:
code渲染! (metricView.js:86) 循环 (models metricView.js:88) d {length: 1, models: Array[1], _byId: Object, _byCid: Object, _callbacks: Object...} (metricView.js:89)模型循环 10.0.0.1 metricView.js:92 在视图中渲染项目 10.0.0.1code -
你是如何实例化
MetricView的? (提示:编辑 qestion 而不是发布代码或控制台输出作为评论) -
感谢@JonathanNaguin,我用控制台和类初始化更新了问题。
-
你在某个地方查
metricdevices的内容吗?因为您似乎只是在initialize函数中调用fetch...
标签: backbone.js collections render