2015-09-16 1 views
1

У меня есть представление, что я хочу повторно использовать в CompositiveView, что для многоразового представления необходимо загрузить модель с определенным набором свойств и каждый член коллекции, переданный в CompositiveView имеет ли свойства, но инкапсулированные во внутреннем объекте, например:Marionette CompositeView - модель управления, перенесенная в ChildView

{ 
    foo: "foo", 
    bar: "bar" 
    objWithStuffThatINeed: { 
     ... 
    } 
} 

многоразовый вид имеют к идее этой иерархии, и я не могу изменить эту точку зрения, чтобы сделать его знает об этом. Мне было интересно, есть ли способ передать только, что objWithStuffThatINeed в childView вместо всего элемента в текущей итерации коллекции.

ответ

1

Вы можете изменить модель ItemView, в которой используются только поля, которые вам нужны.

$(function() { 
 
    // You reusable view.  
 
    var ExampleItemView = Backbone.Marionette.ItemView.extend({ 
 
     tagName: "li", 
 
     template: _.template('<%- baz%>'), 
 
    }); 
 
    
 
    var ExampleCompositeView = Backbone.Marionette.CompositeView.extend({ 
 
    
 
     tagName: "ul", 
 
     childView: ExampleItemView, 
 
     template: _.template(''), 
 
     
 
     buildChildView: function(child, ChildViewClass, childViewOptions) { 
 
      // create the child view instance 
 
      var view = new ChildViewClass({ 
 
      model: new Backbone.Model(child.get('objWithStuffThatINeed')) 
 
      }); 
 
      // return it 
 
      return view; 
 
     } 
 
     
 
    }); 
 
    
 
    var testCollection = new Backbone.Collection(
 
     [{ 
 
      foo: 'foo1', 
 
      bar: 'bar1', 
 
      objWithStuffThatINeed: { 
 
      baz: "baz1" 
 
      } 
 
     }, 
 
     { 
 
      foo: 'foo2', 
 
      bar: 'bar2', 
 
      objWithStuffThatINeed: { 
 
      baz: "baz2" 
 
      } 
 
     } 
 
     ] 
 
    ); 
 
    
 
    var region = new Backbone.Marionette.Region({ 
 
     el: '.main-region' 
 
    }); 
 
    
 
    region.show(new ExampleCompositeView({ 
 
     collection: testCollection 
 
    })); 
 
    
 
});
<!DOCTYPE html> 
 
<html> 
 

 
    <head> 
 
    <script data-require="[email protected]*" data-semver="2.1.4" src="http://code.jquery.com/jquery-2.1.4.min.js"></script> 
 
    <script data-require="[email protected]*" data-semver="1.8.3" src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script> 
 
    <script data-require="[email protected]*" data-semver="1.1.2" src=" //cdnjs.cloudflare.com/ajax/libs/backbone.js/1.1.2/backbone-min.js"></script> 
 
    <script data-require="[email protected]*" data-semver="2.2.2" src="http://cdnjs.cloudflare.com/ajax/libs/backbone.marionette/2.2.2/backbone.marionette.js"></script> 
 
    <link rel="stylesheet" href="style.css" /> 
 
    <script src="script.js"></script> 
 
    </head> 
 

 
    <body> 
 
    <div class="main-region"></div> 
 
    </body> 
 

 
</html>

+0

Это решило мою проблему отлично, мне интересно, почему эту функцию нет в документации? Большое спасибо @ sergey-ratnikov – Hugo

0

Вы можете использовать childViewOptions (который дополняет childView), чтобы не только обеспечить дополнительные возможности конструктора для взглядов ребенка, но и опции переопределить конструктор обеспечивает CollectionView сам, а именно model.

var MyCompositeView = Backbone.Marionette.CompositeView.extend({ 

    childView: MyChildView, 

    childViewOptions: function (child) { 
    // Override the model otherwise provided by CollectionView 
    return { 
     model: new Backbone.Model(child.get('objWithStuffThatINeed')) 
    }; 
    }, 

    ... 

}); 

оригинальный buildChildView выглядит следующим образом:

Вы можете изменить это тоже, если вам нужно сделать что-то больше, чтобы создать представление ребенка, чем вызов конструктора объекта с параметрами.