2012-06-24 15 views
14

Po pierwsze, przeszukałem i nie odpowiedziałem na stackoverflow/google pod warunkiem, że to, czego chciałem.Przekazywanie argumentów do zdarzeń w sieci szkieletowej

Oto fragment mojego kodu:

//in the view 
this.collection.on("add",triggerthis) 
this.collection.add(predefinedModel) 
triggerthis: function(a, b, c, d){ 
    //etc. 
} 

Zasadniczo, chcę być w stanie przekazać argument na Dodaj i odbierać argument w triggerthis. czy to możliwe?

Z góry dziękuję.

+1

Ponieważ 'triggerthis' obsługi zdarzeń będzie wywoływana przez kod zdarzenia szkieletowej, gdzie można się spodziewać tych dodatkowy argument pochodzi? –

+0

Przepraszam, ale nie jestem pewien, jak to działa. Przypuszczam, że mogę wywołać anonimową funkcję w on(), która wywołuje triggerthis wewnątrz, ale nie jestem pewien, czy to jest dobry sposób, aby kontynuować. – chenglou

Odpowiedz

30

Nie można tego zrobić tak, jak chcesz bez użycia nieudokumentowanych funkcji.

Jeśli spojrzeć na Collection#add zobaczymy to:

add: function(models, options) { 
    //... 
    for (i = 0, l = add.length; i < l; i++) { 
    (model = add[i]).trigger('add', model, this, options); 
    } 
    //... 
} 

Uwaga czwarty argument trigger. A jeśli spojrzeć na udokumentowany interfejs dla trigger:

spustobject.trigger(event, [*args])

Callbacki progowe dla danego imprezy lub przestrzeni oddzielonych listy zdarzeń. Kolejne argumenty do wyzwalacza wyzwalacza będą przekazywane dalej do wywołań zwrotnych zdarzeń.

Więc add wezwie słuchaczy jak f(model, collection, options) gdzie options jest taka sama options co przeszedł do Collection#add.Powoduje to, że jeśli to zrobić:

this.collection.add(predefinedModel, { undocumented: 'arguments' }) 

następnie można zrobić to w swojej callback:

triggerthis: function(model, collection, options) { 
    console.log(options.undocumented); 
} 

Demo: http://jsfiddle.net/ambiguous/bqWwQ/

Mogłabyś tunelu oczywiście cały tablicy lub obiektu przez options w ten sposób.

Trzeci argument za "add" zdarzeń nie jest udokumentowana (przynajmniej nie że znajdę), najbliższa rzecz do dokumentacji jest to notatka w 0.3.3 Changelog entry:

Wszechobecne options argument jest teraz przekazywany jako ostateczny argument do wszystkich zdarzeń "change".

Nie polecałbym tego podejścia, ale jest tam, jeśli jest to potrzebne; oczywiście będziesz musiał to uwzględnić w swoim pakiecie testowym, a będziesz musiał upewnić się, że nie użyjesz żadnych kluczy w numerze options, którego użyje Szkielet.


Bezpieczniejsze podejście byłoby dołączyć jakieś dodatkowe właściwości do modelu

model.baggage = { some: 'extra stuff }; 

a następnie obrać że off w callback:

triggerthis: function(model, collection) { 
    var baggage = model.baggage; 
    delete model.baggage; 
    //... 
} 

Demo: http://jsfiddle.net/ambiguous/M3UaH/

Można również użyć różnych wywołań zwrotnych do różnych celów lub przekazać dodatkowy parametr jako pełnowartościowe atrybuty modelu.

Jest też _.bind:

this.collection.on("add", _.bind(function(collection, model, extra) { ... }, context, collection, model, 'whatever you want')); 

ale że zwiąże argumenty od lewej do prawej, więc musisz określić wszystkie argumenty, że zwrotna będzie potrzebne.

Demo: http://jsfiddle.net/ambiguous/jUpJz/

+0

upvote - podobnie jak technika bagażowa - działa dobrze! dzięki – sambomartin

6

Jeśli wartości przekazywane do funkcji są zawsze takie same, można go za pomocą _.bindpartially apply (lub native Function.bind jeśli są dostępne)

Np Gdzie jesteś wiązania obsługi do add (zakładając triggerThis to metoda w widoku):

this.collection.on('add', _.bind(this.triggerThis, this, a, b, c, d)); 

Definicja triggerThis:

triggerThis: function(a, b, c, d /*, model, collection, options - if you need them*/) { 
    ... 
} 

Jeśli chcesz przekazać argumenty indywidualne dodaj połączenie, możesz użyć drugiego parametru options do add, a następnie obsłużyć go w swojej procedurze obsługi zdarzeń.

E.g.

this.collection.on('add', this.triggerThis, this); 
this.collection.add(model, { 
    someCustomValue: 'hello'; 
}); 

Następnie w przewodnika:

triggerThis: function(model, collection, options) { 
    var val = options.someCustomValue; 
    ... 
} 
+0

Problem polega na tym, że trzeci argument "options" nie jest dokładnie udokumentowany. –

+0

Prawda, chociaż w jednym z wpisów dziennika zmian (dla 0.9.0) wspomina, że ​​"W przypadku zdarzeń dodawania i usuwania kolekcji indeks dodawanego lub usuwanego modelu jest teraz dostępny jako options.index." więc przypuszczam, że prawdopodobnie nie odejdzie w najbliższym czasie. – jimr

+0

Argument "opcje" dla wywołań zwrotnych to rodzaj szarego obszaru, a doktorzy rozmawiają wokół niego bez upewnienia się, że on tam jest. Podejrzewam, że w pewnym momencie zostanie ona uprawomocniona. Po prostu warto wspomnieć, że są pewne zastrzeżenia. –

Powiązane problemy