2013-02-12 8 views
6

In der folgenden Layout, ich bin eine CollectionView hinzufügen, um eine SELECT-Liste innerhalb onRender anzuzeigen. Unmittelbar danach verwende ich den UI-Hash, um alle Steuerelemente innerhalb der Ansicht zu aktivieren oder zu deaktivieren. Dies funktioniert nicht für den von new App.View.Categories generierten SELECT.UI-Hash-Probleme mit Backbone Marionette Layout

Sollte es? Oder funktioniert der UI-Hash nicht unter Regions innerhalb einer Layout?

App.View.UploadFile = Backbone.Marionette.Layout.extend({ 
    template: '#upload-file-template', 
    regions:{ 
     category: 'td:nth-child(4)' 
    }, 
    ui:{ 
     inputs: 'textarea, select, .save' 
    }, 
    onRender: function(){ 
     this.category.show(
      new App.View.Categories({ 
       collection: App.collection.categories 
      }) // generates the SELECT list 
     ); 

     console.log(this.ui.inputs); // Length 2. Missing select. 
     console.log(this.$('textarea, select, .save')); // Length 3 

     this.ui.inputs.prop(
      'disabled', (this.model.get('upload_status')!='staged') 
     ); 
    } 
}); 

Antwort

11

Dies sollte funktionieren, wie Sie es erwarten, dass es funktioniert. Der betreffenden Code in der Quelle ist hier Marionette: https://github.com/marionettejs/backbone.marionette/blob/master/src/marionette.itemview.js#L49-L51

Der Aufruf von bindUIElements() ist, was den ui Hash wandelt in jQuery Selektor Objekten, und es wird aufgerufen, kurz bevor die onRender Methode aufgerufen wird.

Sie sehen Fehler? Oder gibt der Selektor einfach nichts zurück und hat keinen Einfluss auf die Elemente?


Update:

Ah! Natürlich ... Ich habe deinen Code nicht genau genug beachtet. Sie haben Recht, dass die UI-Element-Selektoren passieren, bevor Sie die Unteransicht der Region hinzufügen. Ich bin noch nie in diese Situation hineingelaufen ... aber das scheint etwas zu sein, was wir reparieren/unterstützen wollen.

Die beste Problemumgehung, die ich vorschlagen kann, wäre jetzt, 'this.bindUIElements();' ganz am Ende Ihrer onRender-Methode. Dies würde die ui-Elemente zwingen, sich erneut an die Selektoren zu binden.

Ich werde auch ein Problem in die Github-Problemliste hinzufügen, um nach einer besseren Lösung dafür zu suchen. Ich weiß nicht, wann ich dazu in der Lage sein werde, aber das wird es zumindest auf die Liste der zu reparierenden Dinge bringen.

+0

Es gibt keine Fehler. Ich habe oben ein Beispiel console.logs hinzugefügt. Der Selektor verlässt die Auswahl, aber es gibt die anderen zwei Elemente zurück. Wie Sie in der zweiten console.log sehen können, funktioniert der gleiche Selektor in $ works. – Bart

+0

Mit Blick auf die Quelle, denke ich, sehe ich das Problem. Diese Elemente werden gebunden, BEVOR das SELECT-Element in onRender hinzugefügt wird. Vielleicht ist das Hinzufügen von Regionen in onRender nicht die beste Vorgehensweise. Hast du ein anderes Muster zu empfehlen? – Bart

+0

Danke für das Update! – Bart

Verwandte Themen