2015-01-08 4 views
0

Я пытаюсь отобразить список с помощью Marionette CompositeView. Я не уверен, почему в представленном списке есть элемент, отображающий слово result. Я ожидал, что первый элемент отобразит Level 1.Магистральный марионетт Композитный вид Rendering Template

Вот скрипку в мой текущий код: http://jsfiddle.net/16L1hen4/

Вот мой JS, шаблон, и данные:

JavaScript:

var App = new Backbone.Marionette.Application(); 

App.addRegions({ 
    mainRegion: '#main' 
}); 

var TreeModel = Backbone.Model.extend({  
}); 

var TreeCollection = Backbone.Collection.extend({ 
    model: TreeModel, 

    url: 'https://api.mongolab.com/api/1/databases/backbone-tree/collections/tree?apiKey=somekey' 

}); 

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

    initialize: function() { 
     console.log(this.collection); 

    }, 

    tagName: 'ul', 

    template: _.template($('#tree-template').html()) 
}); 

var treeCollection = new TreeCollection(); 
treeCollection.fetch().done(function() { 
    var treeView = new TreeView({collection: treeCollection}); 
    App.mainRegion.show(treeView);  
}); 

Шаблон:

<div id="main"></div> 

<script type="text/template" id="tree-template"> 
    <li><%- name %></li> 
</script> 

JSON Данные:

{ 
    "_id": { 
     "$oid": "54adab80e4b0aa674b256836" 
    }, 
    "name": "Level 1", 
    "children": [ 
     { 
      "name": "Child 1 - Level 2", 
      "children": [ 
       { 
        "name": "Jon - Level 3" 
       }, 
       { 
        "name": "Mary - Level 3" 
       } 
      ] 
     }, 
     { 
      "name": "Child 2 - Level 2", 
      "children": [ 
       { 
        "name": "Bill - Level 3" 
       } 
      ] 
     } 
    ] 
} 
+1

Compositeview принимает коллекцию Backbone моделей для визуализации, а не одной модели. Для того, чтобы вложить модели, вы также можете использовать коллекцию в составе viewview. – Trace

+0

@KimGysen Спасибо. Я редактировал вопрос и код, чтобы использовать «Backbone.Collection» вместо «Backbone.Model». Я все еще понимаю, почему первый элемент отображает слово «результат». – Mdd

+1

Это небольшое изменение и не связано с фактическим вопросом, но вы можете напрямую ссылаться на шаблон с шаблоном 'template:" # tree-template "' вместо метода подчеркивания; Marionette автоматически найдет шаблон для вас, используя знак подчеркивания, если это строковая ссылка на объект DOM. – mix3d

ответ

1

Вы используете CompositeView для отображения коллекции, но вы должны определить childView для визуализации моделей

var LeafView = Backbone.Marionette.ItemView.extend({ 
    // ... 
}); 

var TreeView = Backbone.Marionette.CollectionView.extend({ 
    childView: LeafView 
}) 

здесь обновленная скрипка. http://jsfiddle.net/6ok1rptq/

Теперь «результат», показывающие в HTML, не будучи знакомым с источником подчеркивания, я считаю, что это вызвано тем, что data дается шаблон пустой, и быстрый взгляд на источнике подчеркивания показывает, что она использует with

http://underscorejs.org/docs/underscore.html#section-148

«Если переменная не задана, значения место данных в локальной области.»

Это означает, что шаблон не может найти «имя» переменный, и вместо того, чтобы посмотреть его в глобальном масштабе (window)

Результат просто название jsfiddle фрейма, содержащего результат скрипки

<iframe name="result" ...> 
+0

Благодарим вас за прекрасное объяснение. Я не понимал, что для CompositeView требуется дочерний элемент. – Mdd

1

Я не проверял это, но я предполагаю, что ошибка заключается в том, что вы не определили элемент Item Marionette в CompositeView.

Логическая структура заключается в передаче коллекции Compositeview, как и в вопросе, и модели будут отображаться в отдельных элементах.
В itemview вы можете позвонить:

this.model.get("property"); 

Чтобы получить доступ к свойствам внутри вида.

+0

Спасибо @KimGysen. Я не понимал, что элемент ItemView необходим для CompositeView. Я думал, что определить шаблон будет достаточно. – Mdd

+1

@Mdd Добро пожаловать. Для Compositeview вы можете определить шаблон, потому что он позволяет вам создать div-оболочку и определить родительский элемент в этой оболочке-обертке, в которой вы хотите визуализировать представления элементов. Вы не можете сделать это с помощью коллекции. – Trace

2

Прочитайте marrionnete документы немного ближе - вам нужен childView определенный ....

+0

Должно быть, я неправильно понял документы. Я думал, что шаблона будет достаточно, и если бы использовался childView, он просто был бы добавлен внутри шаблона. – Mdd

+0

Я побледнел, вы разобрались! Лично я думаю, что marrionnete является лучшим другом позвоночника :) – Beckafly

+0

Спасибо, Byaxy! :) – Mdd

Смежные вопросы