2013-03-20 28 views
6

Tôi có một CollectionViewTrong Bộ sưu tập Marionette, làm cách nào tôi có thể chuyển chỉ mục của mô hình (trong bộ sưu tập) đến ItemView?

class MyCollectionView extends Backbone.Marionette.CollectionView 
    itemView: MyItemView 

    itemViewOptions: -> 
    { 
     indexInCollection: ? 
    } 

Và tôi muốn MyItemView biết lúc đó chỉ số trong bộ sưu tập mô hình của nó là lúc.

Tôi cho rằng, trong MyItemView, tôi có thể tìm thấy nó ra qua

@model.collection.indexOf(@model) 

Nhưng có một cách để vượt qua nó trong trực tiếp vào MyItemView từ rối CollectionView của tôi, sử dụng một số cơ chế rối nội bộ? Chỉ số này có tiếp xúc ở đâu đó không?

Trả lời

12

itemViewOptions, khi được thiết lập làm hàm, nhận thông số item hoặc model. Sử dụng điều này để tìm index:


class MyCollectionView extends Backbone.Marionette.CollectionView 
    itemView: MyItemView 

    itemViewOptions: (model) -> 
    { 
     indexInCollection: this.collection.indexOf(model) 
    } 
+0

Ah hoàn hảo - Tôi biết chắc chắn phải có một cái gì đó tao nhã như điều này. Cảm ơn Derick. – Joerg

+0

woah cool i đã không nhận thức được điều này! –

+0

Giải pháp tuyệt vời ở đây – jmeas

1

Chỉ cần thêm vào câu trả lời trước, nếu bạn muốn sử dụng một trong các tùy chọn trong một trong những điểm mẫu của bạn, bạn chỉ có thể làm điều đó như thế này:

class Run.Question extends Backbone.Marionette.ItemView 
    template: "mock/run/question" 
    initialize: -> 
     @model = @model.set index: @options.index 

class Run.Content extends Backbone.Marionette.CompositeView 
    template: "mock/run/content" 
    itemView: Run.Question 
    itemViewContainer: "div.data-box" 
    itemViewOptions: (model) -> 
     { 
      index: @collection.indexOf(model) + 1 
     } 

Bằng cách này, bạn có thể truy cập vào biến "index" trong mẫu của bạn.

+1

Có lẽ tốt hơn để ghi đè 'serializeData' và hiển thị var chỉ mục cho mẫu từ đó. – vaughan

6

Kể từ rối 2.0.0 bạn có thể làm điều đó với một childViewOptions chức năng:

var CollectionView = Marionette.CollectionView.extend({ 
    childViewOptions: function(model, index) { 
    // do some calculations based on the model 
    return { 
     foo: "bar", 
     childIndex: index 
    } 
    } 
}); 

Như đã giải thích trong tài liệu rối cho childViewOptions

Các vấn đề liên quan