2013-02-12 8 views
6

Layoutでは、CollectionViewを追加して、onRender内のSELECTリストを表示しています。その直後、uiハッシュを使用して、ビュー内のすべてのコントロールを有効または無効にします。これはnew App.View.Categoriesによって生成されたSELECTに対しては機能しません。Backbone MarioetteレイアウトでのUIハッシュの問題

すべきですか?または、Layoutの中でUIハッシュがRegionsで機能しないのですか?

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') 
     ); 
    } 
}); 

答えて

11

これは、動作するように動作するはずです。マリオネットのソースの問題のコードはここにある:https://github.com/marionettejs/backbone.marionette/blob/master/src/marionette.itemview.js#L49-L51

bindUIElements()への呼び出しは、jQueryのセレクタのオブジェクトにでuiハッシュに変換するものであり、onRenderメソッドが呼び出される直前に呼び出されます。

あなたはエラーが発生しましたか?または、セレクタが何も返さず、要素に影響を与えないのですか?


更新:

ああ!もちろん...私は十分にあなたのコードに注意を払っていませんでした。サブビューをリージョンに追加する前に、UIエレメントセレクターが発生しているという点は正しいです。私はこれまでにこのような状況に陥ったことはありません...しかし、これは私たちが修正/サポートしたいもののようです。

今のところ私が提案できる最良の回避策は 'this.bindUIElements();'を呼び出すことです。あなたのonRenderメソッドの最後に。これにより、ui要素はセレクタに再バインドされます。

github issueリストに問題を追加して、より良い解決策を探してみましょう。私はこれに着くことができる時を知らないが、これは少なくとも修正すべき事柄のリストに載せるだろう。

+0

エラーはありません。私は上記のいくつかの例console.logを追加しました。セレクタはselectを省略していますが、他の2つの要素を返しています。 2番目のconsole.logでわかるように、同じセレクタが$ worksで囲まれています。 – Bart

+0

ソースを見ると、私は問題があると思う。これらのアイテムは、SELECTアイテムがonRender内に追加される前にバインドされています。おそらく、このようなリージョンをonRender内に追加することはベストプラクティスではありません。お勧めする別のパターンがありますか? – Bart

+0

更新いただきありがとうございます! – Bart