Dies:
events: {
"xxx": "eventHandler1",
"yyy": "eventHandler2",
"xxx": "eventHandler3"
}
wird nicht funktionieren, weil events
ist ein Objektliteral und Sie können höchstens ein (Schlüssel-, Wert-) Paar in einem Objekt haben. Das wäre wahrscheinlich das gleiche wie zu sagen:
events: {
"xxx": "eventHandler3",
"yyy": "eventHandler2"
}
Diese Coffee:
events:
"xxx": "eventHandler1"
"yyy": "eventHandler2"
"xxx": "eventHandler3"
an die JavaScript-Version funktional identisch ist und wird aus dem gleichen Grund nicht funktionieren.
Andy Ray Idee von
mit
'event selector': 'callback1 callback2'`
wird nicht funktionieren entweder als Backbone nicht verstehen, dass sie den Wert auf Leerzeichen aufgeteilt werden soll; In ähnlicher Weise folgt aus:
'event selector': [ 'callback1', 'callback2' ]
wird nicht funktionieren, weil Backbone nicht wissen, was in diesem Zusammenhang mit einer Reihe zu tun.
Ansichten binden ihre Veranstaltungen durch delegateEvents
und sieht wie folgt aus:
delegateEvents: function(events) {
// Some preamble that doesn't concern us here...
for (var key in events) {
var method = events[key];
if (!_.isFunction(method)) method = this[events[key]];
if (!method) throw new Error('Method "' + events[key] + '" does not exist');
// And some binding details that are of no concern either...
}
}
So method
beginnt für 'event selector'
als Wert aus.Wenn es sich um eine Funktion von etwas ist wie:
'event selector': function() { ... }
dann wird es verwendet, wie sie ist, sonst ist es zu einer Eigenschaft von this
umgewandelt wird:
method = this[events[key]]; // i.e. method = this[method]
Wenn man fett, so könnte man delegateEvents
einstellen
// Untested code.
var methods = [ ];
if (_.isArray(method))
methods = method;
else if (_.isFunction(method))
methods = [ method ];
else
methods = method.split(/\s+/);
for (var i = 0; i < methods.length; ++i) {
method = methods[i];
if (!_.isFunction(method))
method = this[method];
// And the rest of the binding stuff as it is now with a possible adjustment
// to the "method does not exist" exception message...
}
ein ziemlich einfaches Pflaster wie das Sie erlauben würde, eine Leerzeichen getrennte Liste von Handler zu verwenden: einen Array oder Leerzeichen getrennte Zeichenfolge zu verstehen
'event selector': 'callback1 callback2'
oder ein Array von Handler:
'event selector': [ 'callback1', 'callback2' ]
oder auch eine gemischte Anordnung von Methodennamen und Funktionen:
'event selector': [ 'callback_name1', function() { ... }, 'callback_name2' ]
Wenn Sie wollen Ihr Backbone nicht patchen oder weiterleiten So ein Patch an die Backbone-Betreuer, dann könntest du mit deiner ursprünglichen "Manual Dispatching" Idee gehen:
Ich bin bereit zu wetten "xxx": "eventHandler1 eventHandler2" funktioniert, testet jetzt –
@AndyRay: Wie viel möchten Sie wetten? https://github.com/documentcloud/backbone/blob/master/backbone.js#L1242 –
@muistooshort, also kann ich sagen, die Methode, die ich jetzt verwenden sollte, ist: '" eventname ": function (e) {handler1 (e); handler2 (e)} '? – jm2