2016-07-28 5 views
0

aufgerufen Ich habe eine Ansicht mit folgendem initialize Methode:Modell zeigt als undefiniert machen, wenn bei Ereignis

initialize: function(){ 
    this.model.on("all", this.render) 
}, 

Und in der Methode machen ich Zugriff auf den Inhalt des Modells:

var contents = this.model.attributes.content; 

Die content Eigenschaft des Modells ist ein Array.
Also, wenn ich etwas zu dem Array mit model.set() über die Konsole hinzufügen, wird die Rendermethode aufgerufen, aber ich bekomme den folgenden Fehler: Uncaught TypeError: Cannot read property 'attributes' of undefined(…).
Aber nach dem Hinzufügen, wenn ich view.render() manuell aufrufen, macht es das Modell schön.
Wenn ich noch etwas hinzufüge, wird derselbe Fehler ausgegeben.
Lösungen?

Antwort

3

könnte das Problem der Kontext (der Wert von this), in dem die render ausgeführt wird - aufgrund der Ereignisauslöser.

Wenn Sie einen Debugger setzen und den Wert this in der render untersuchen, der durch die Modelländerung ausgeführt wird, würde es nicht die Referenz view enthalten.

Sie können dies, indem einen dritten Parameter an die on wie in backbone documentation angegeben repariert:

this.model.on('all', this.render, this); 

Der dritte Parameter ist der Kontext, in dem die render ausgeführt würde. Was immer Sie als dritten Parameter übergeben, wäre der Wert this innerhalb der render-Funktion.

Es ist besser, listenTo anstelle von on zu verwenden, da es die Ereignisse auf eine bessere Weise bereinigt als on tut. Sie können eine nette Erklärung für die gleiche Sache hier bei stackoverflow Frage Backbone js .listenTo vs .on lesen.

initialize: function() { 
    this.listenTo(this.model, 'all', this.render); 
} 

Und auch, würde ich empfehlen die get Methode zur Verfügung, in model zu verwenden, um es Attribut ist für den Zugriff, also statt this.model.get('content')content durch this.model.attributes.content Verwendung Zugriff:

So würde die initialize geschrieben werden.

Hoffe es hilft :)

1

Da Sie mit this.model.on("all", this.render) hören, wird Ihre Renderfunktion das Modell als Kontext erhalten, d. H. Wenn der Callback aufgerufen wird, bezieht sich "this" auf das Modell. Versuchen Sie es mit this.listenTo(this.model, "all", this.render). Auf diese Weise können Sie den Kontext festlegen.

Verwandte Themen