-1

ich meine Ansicht mit einer neuen Kollektion erstellen.Ein- und Aus-Ereignis funktionieren nicht gut

I Feuer hinzufügen und synchronisieren Ereignisse:

this.mapDetailsCOllection.on('add', self.onAddElement, self); 
this.mapDetailsCOllection.on('sync', self.onSync, self); 

holen Bevor ich tun:

this.mapDetailsCOllection.off("add"); 
this.mapDetailsCOllection.fetch(); 

Und wenn holen ist ok, in meinem Sync-Rückruf:

this.mapDetailsCOllection.on('add', self.onAddElement, self); 

Aber auch wenn ich das Add Event aufschieben ich gehe jedes Mal in Add Event Callback-Funktion, wenn ich holen.

+0

Bitte legen Sie ein [minimal, vollständig und überprüfbar Beispiel] (http://stackoverflow.com/help/mcve) . –

Antwort

1

Ich werde das folgende vorschlagen, weil ich keinen Zusammenhang habe, wie Sie Ihre Anwendung entworfen haben (Backbone.js ist großartig, weil es Ihnen eine Menge Seil gibt, aber wie Sie Ihre Anwendung gestalten können ändern Sie, wie Sie Synchronisierungslösungen implementieren müssen). Ich bin mehr als glücklich, anzupassen, zu erweitern, oder diesen Beitrag zu klären, wenn Sie ein wenig mehr über gemeinsam nutzen können, wie Sie Ihre App, Ansicht, Sammlung, und Modellcode architected habe für mich zu verstehen, was Sie zu erreichen versuchen.

In Ihrem Code, würde ich auf die update Ereignis hören statt des add Ereignis (seit add auf jedem neuen Element löst hinzugefügt, um die Sammlung, im Vergleich zu update die nach löst eine beliebige Anzahl von Elementen hinzugefügt/entfernt wurden aus einer Sammlung). Dann würde ich die on/off Änderung für add Ereignis entfernen und stattdessen haben Ihrer Meinung nach eher auf Collection.reset Ereignis hören als das Ausschalten und auf Ihre Zuhörer für Ihren Abruf/Sync-Zyklus.

Ich habe diese Art von anzeigen Design-Muster in der Vergangenheit erfolgreich verwendet:

var _ = require('lodash'); 
var DocumentRow = Backbone.View.extend({ 
    events: { 
    "click #someEl": "open" 
    }, 

    clean: function() { 
    // cleans up event bindings to prevent memory leaks 
    }, 

    initialize: function(options) { 
    _.bindAll(this, [ 
     'initialize', 
     'open', 
     'render', 
     'clean' 
    ]); 

    options = options || {}; 
    this.collection = options.collection ? options.collection : SomeCollection; 
    this.listenTo(this.collection, "reset", this.render); 
    }, 

    open: function(item) { 
    ... 
    }, 

    render: function() { 
    ... 
    } 

}); 
+0

Warum '_.bindAll'?'this.listenTo'- und' events'-Callbacks haben in diesem Fall automatisch den View-Kontext. 'options.collection' wird auch vor dem Initialisieren im Konstruktor auf' this.collection' gesetzt. –

+0

Danke für die Anleitung Emile. Es ist ein paar Jahre her, dass ich mit Backbone eine Produktions-App-Entwicklung gemacht habe. Das sind Änderungen, die bei meiner letzten Arbeit mit Backbone nicht vorhanden waren. –

+1

Fair genug, 'listenTo' wurde am 13. Dezember 2012 in v0.9.9 hinzugefügt, aber' events' und die 'collection' Option waren dort in 0.1.0. Ich wundere mich immer noch, warum '_.bindAll', vielleicht, wenn Sie' view.render' als Rückruf übergeben, aber hier ist es nicht relevant. –

0

Auf dieser Basis:

Das Verhalten holen kann durch die Verwendung des zur Verfügung stehenden Satz Optionen angepasst werden. Um zum Beispiel eine Sammlung zu holen, jedes neue Modell ein „add“ Ereignis für immer, und ein „change“ -Ereignis für jede geändert bestehende Modell, ohne etwas zu entfernen:

collection.fetch({remove: false}) 

collection.set(models, [options]) und diese:

alle entsprechenden „add“, „entfernen“ und „change“ Ereignisse abgefeuert werden, wie dies geschieht. Gibt die berührten Modelle in der Sammlung zurück. Wenn Sie möchten, dass das Verhalten anpassen, können Sie es mit den Optionen deaktivieren: {add: false}, {entfernen: false} oder {fusionieren: false}.

können Sie

collection.fetch({add: false}) 

zu vermeiden passieren add Ereignis zu feuern.

Verwandte Themen