2017-06-29 156 views
0

我正在開發一個帶有自定義標頭/ ts和content/td的表格。當我定義事件,並單擊鉤按鈕時,觸發的事件多次:Backbonejs事件被多次觸發

查看

//VISTA DE CABECERA 
var FieldTableHeaders = Backbone.View.extend({ 
    el: $("#entity-fields tr"), 
    template: _.template("<th><%= field.Placeholder %></th>"), 
    initialize: function(){ 
     this.render(); 
    }, 
    render: function() { 
     console.log(this.model); 
     $(this.el).append(this.template({ 
      field: this.model 
     })); 

     return $(this.el); 
    }, 
}); 

//VISTA DE CONTENIDO 
var FieldTableContent = Backbone.View.extend({ 
    el: $("#entity-items"), 
    template: _.template($("#fieldActions").html()), 
    events: { 
     'click .entityView': 'example' 
    }, 
    initialize: function(options){ 
     this.render(); 
    }, 
    render: function() { 
     $(this.el).append(this.template({ 
      field: this.model 
     })); 

     return $(this.el); 
    }, 
    example: function(){ 
     alert('sadasdasd') 
    } 
}); 

模型

// 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> 

enter image description here

什麼問題?

+1

你能也暴露出調用'EntityFields'的代碼?還有一個建議是使用'class'而不是'id'作爲'entityView','entityDelete'和'entityEdit',因爲你可以有多個字段,並且'id'屬性在頁面上應該是唯一的 –

+0

你是對的。修復和添加模型。我新的骨幹。 – 50l3r

+0

我嘗試使用jQuery事件$(「。entityView」)。click(function(){self.example();})但did not work – 50l3r

回答

0

那麼,你應該知道的第一件事是$ (this.el)是沒有必要的,因爲骨幹自動執行,它得到像this.$el

回答你的問題,根據code,每個視圖將其事件委託給包裝在她內部的每個元素。
因此它會將'click .entityView':'example'委託給el: $("#entity-items")中的每個.entityView
也就是說,第一個.entityView將被分配與表中元素一樣多的事件。而最後的.entityView只有1個事件。

一個解決方案覆蓋delegate方法可能會奏效:

// ...extend({ 
delegate: function(eventName, selector, listener) { 
    this.$el.find(selector).last().on(eventName + '.delegateEvents' + this.cid, listener); 
    return this; 
}, 
// ... 
+0

已添加並修復。 Muchas gracias,我建立了volviendo loco :) – 50l3r

+0

SO是一個英文站點,請避免在內容中使用任何其他語言。有關西班牙語內容,請參閱[Stack Overflow enespañol](https://es.stackoverflow.com/)。 –

+0

另外,**不要重寫'delegate' **來實現這一點,而是在設計中解決問題。 –