Javascript 多次触发Backbonejs事件
我正在开发一个带有自定义标题/ts和内容/td的表。当我定义一个事件并单击挂钩按钮时,该事件会多次触发: 观点 表中每行触发一次事件 这是内容模板:Javascript 多次触发Backbonejs事件,javascript,jquery,events,backbone.js,Javascript,Jquery,Events,Backbone.js,我正在开发一个带有自定义标题/ts和内容/td的表。当我定义一个事件并单击挂钩按钮时,该事件会多次触发: 观点 表中每行触发一次事件 这是内容模板: <script type="text/html" id="fieldActions"> <tr> <% _.each(field, function(val, i) { %> <td><%= val %></td> <% }); %>
<script type="text/html" id="fieldActions">
<tr>
<% _.each(field, function(val, i) { %> <td><%= val %></td> <% }); %>
<td class="text-center">
<a class="btn btn-info btn-rounded btn-xs entityView"><i class="fa fa-eye"></i> Ver</a>
<a class="btn btn-warning btn-rounded btn-xs entityEdit"><i class="fa fa-pencil"></i> Editar</a>
<a class="btn btn-danger btn-rounded btn-xs entityDelete"><i class="fa fa-trash"></i> Eliminar</a>
</td>
</tr>
</script>
有什么问题吗?好吧,首先你应该知道的是,$(this.el)
不是必需的,因为主干会自动执行,它会像这样。$el
根据,回答您的问题时,每个视图都将其事件委托给包装在其内部的每个元素。
因此,它将把'click.entityView':'example'
委托给el:$(“#实体项”)中的每个.entityView
。
也就是说,第一个.entityView
将分配与表中元素数量相同的事件。最后一个.entityView
只有一个事件
覆盖委托
方法的解决方案可能会起作用:
/…扩展({
委托:函数(eventName、选择器、侦听器){
this.$el.find(selector).last().on(eventName+'.delegateEvents'+this.cid,listener);
归还这个;
},
// ...
您还可以公开调用EntityFields
的代码吗?还有一个建议是,对于entityView
、entityDelete
和entityEdit
,使用类
,而不是id
,因为您可以有多个字段,并且id
属性在页面上应该是唯一的e right.Fixed and added models.Im new with backbone.Im尝试使用jquery events$(“.entityView”)。单击(函数(){self.example();}),但无法工作添加和修复的可能副本。Muchas gracias,me estaba volviendo loco:)这是一个英语网站,请避免在内容中使用任何其他语言。有关西班牙语内容,请参阅。此外,不要覆盖委托
。要实现这一点,请在设计中解决问题。
// MODELO DE ENTIDAD UNICA
var CoreEntityModel = Backbone.Model.extend({
defaults: {
_EntityId: null,
_EntityStatus: 0,
_EntityCreateDate: '0000-00-00 00:00:00',
_EntityCreateUser: 0,
_EntityUpdateDate: '0000-00-00 00:00:00',
_EntityUpdateUser: 0
},
idAttribute: "_EntityId"
});
//COLECCIÓN DE ENTIDADES
var EntityCollection = Backbone.Collection.extend({
model: CoreEntityModel
});
//MODELO DE APLICACION
var CoreAplicacionModel = Backbone.Model.extend({
//Instanciar app
defaults: {
ElementsPerPage: 20,
Fields: {},
ID: null,
Name: '',
NameSingular: '',
Permalink: '',
Items: {
Results: [],
Count: 0,
Page: 0
}
},
//Cargar configuracion de app
initialize: function (attrs, opts) {
var self = this;
self.Permalink = attrs;
//Listamos aplicacion
$.ajax(API_PATH + '/apps', {
type: "GET",
dataType: "json",
data: {
permalink: self.Permalink
},
success: function (response) {
var data = response[0];
self.set({
ElementsPerPage: data.ElementsPerPage,
Fields: data.Fields,
ID: data.ID,
Name: data.Name,
NameSingular: data.NameSingular,
Permalink: data.Permalink
});
var Model = self.get('Fields');
var Fields = []
//Recogemos solo campos visibles para cabecera
for (var fieldName in self.get('Fields')) {
if (Model[fieldName].Visible) {
new FieldTableHeaders({
model: Model[fieldName]
});
Fields.push(fieldName);
}
};
self.list(self.get('Items').Page, function(result, data){
if(result){
new FieldTableHeaders({
model: {Placeholder: 'Acciones'}
});
//Recogemos solo campos visibles para contenido
var Items = self.get('Items');
for (var i in Items.Results){
var Values = [];
for (var u in Fields) {
Values.push(Items.Results[i][Fields[u]]);
}
new FieldTableContent({model: Values});
}
}else{
//Ningun registro
}
});
},
error: function (response) {
window.location.href = "pagina-no-encontrada";
}
});
},
// Listar elementos de app
list: function(page, callback){
var self = this;
$.ajax(API_PATH + '/app/'+self.Permalink, {
type: "GET",
dataType: "json",
data: {
page: page
},
success: function (response) {
var Items = self.get('Items');
Items.Page++;
Items.Count = response.count;
for (var item in response.data) {
Items.Results.push(response.data[item]);
}
self.set({Items: Items});
//COLECCIÓN DE ENTIDADES
var entity_collection = new EntityCollection();
entity_collection.add(self.get("Items"));
if (typeof(callback) == "function") {
callback(true, response);
}
},
error: function (response) {
//NO HAY DATOS O ACCESO A API
if (typeof(callback) == "function") {
callback(false, null);
}
}
});
},
idAttribute: "ID"
});
<script type="text/html" id="fieldActions">
<tr>
<% _.each(field, function(val, i) { %> <td><%= val %></td> <% }); %>
<td class="text-center">
<a class="btn btn-info btn-rounded btn-xs entityView"><i class="fa fa-eye"></i> Ver</a>
<a class="btn btn-warning btn-rounded btn-xs entityEdit"><i class="fa fa-pencil"></i> Editar</a>
<a class="btn btn-danger btn-rounded btn-xs entityDelete"><i class="fa fa-trash"></i> Eliminar</a>
</td>
</tr>
</script>