2012-03-28 5 views
11

Ich habe eine Modellinstanz, auf die ich eine andere Modellinstanz setze, d. H. model.set('rsvp', new App.Rsvp).Backbone.js model.get() gibt 'undefined' zurück, obwohl ich die Attribute in console.log sehen kann

Wenn ich über die Sammlung iterieren, um die Liste von ihnen in der Ansicht zu generieren, bekomme ich undefined beim Aufruf .

Doch wenn ich ein console.log(model.rsvp) bekomme ich dies:

Rsvp 
_changing: false 
_escapedAttributes: Object 
_moreChanges: false 
_previousAttributes: Object 
_setting: false 
attributes: Object 
    attending: true 
    created_at: "2012-03-28T09:42:22-05:00" 
    event_id: 20 
    id: 12 
    updated_at: "2012-03-28T09:42:22-05:00" 
    user_id: 3 
__proto__: Object 
cid: "c53" 
id: 12 
__proto__: Rsvp 

So scheint es, dass es kein Problem mit dem Objekt ist, aber die Renditen nicht definiert erhalten.

Ich muss zugeben, meine Javascript-Fähigkeit ist immer noch ziemlich schwach. Was fehlt mir hier?

Antwort

18

console.log(Object) kann Sie betrügen. Es zeigt Ihnen nicht den Status der Object im Moment des Aufrufs console.log.

Aktivieren Sie diese jsFiddle und öffnen Sie die Konsole. Sie sehen, wie die console.log zeigt Ihnen den Status der Object am Ende des Skripts und nicht im Moment der console.log Aufruf.

Für zuverlässigere Informationen rufen Sie console.log mit einfacheren Werten.

(getestet ist Chrome, Firefox und Safari über OSX)

Lesen Sie diese für weitere Informationen: Backbone.js Empty Array Attribute

+0

Sie haben Recht. Es gab einen Fehler mit einem $ .when Aufruf, aber ich wusste nicht, dass das die Ursache des Problems war, weil console.log in Ordnung war. Es war anscheinend nicht in Ordnung. Danke! – MysteriousFist

0

In der Theorie sollte das, was Sie tun, funktionieren, aber es ist wahrscheinlich keine gute Idee, Attribute zu umgehen und Eigenschaften direkt auf Modellinstanzen zu speichern. Hier ist ein jsfiddle that shows it works in concept. Meine Vermutung ist, dass Ihre Modellinstanz von Quelldaten über fetch irgendwo anders in Ihrem Code neu erstellt wird, so dass die model.rsvp Eigenschaft verschwindet. Das oder model ist nicht das gleiche Beispiel, das Sie denken, dass es ist.

+0

verwendet habe ich zunächst versucht mit .set zuerst, mit dem gleichen Ergebnis. Und die 'console.log's sind Rücken an Rücken. So zeigt es die Instanz und zeigt dann undefined, wenn ich versuche, das Attribut zu erhalten. Also sehe ich nicht, wie es während dieser Zeit zurückgesetzt werden würde. – MysteriousFist

0

model.rsvp = foo; (können diesen Code Bit # aufrufen 1), die in äquivalenter Weise model['rsvp'] = foo; ist nicht die Wie model.set({'rsvp':foo}); (Codebit # 2). Wenn Sie ein anderes Modell Instanz anzuheften möchten foo (oder ein anderes Objekt oder einen Wert) auf eine Modellinstanz model, verwenden Sie den Code-Bit # 1 oder dessen Äquivalent. Wenn Sie ein Attributwertpaar zu einer Modellinstanz hinzufügen möchten, die möglicherweise irgendwo dauerhaft gespeichert wird, verwenden Sie das Codebit # 2. Ebenso werden Sie nur model.rsvp definiert haben, wenn Sie model.rsvp = foo; oder model['rsvp'] = foo;

Verwandte Themen