2012-06-30 4 views
3

Я начинаю с магистрали и на мгновение наткнулся на вопрос. Пример приложения, над которым я работаю, - это какой-то плейлист. У меня есть модель «песня» и сборник «Плейлист», содержащий несколько песен.Базовые общие коллекционные коллекции

Данные коллекции плейлистов должны быть доступны в нескольких представлениях. Поэтому моя идея состоит в том, чтобы иметь глобальные прикладные переменные, и одной из этих переменных может быть коллекция списков воспроизведения.

Таким образом, я могу получить песни с инициализацией приложения и получить доступ к данным во всех представлениях приложения.

Ниже то, что я делаю в данный момент

define(
     [ 
      'jQuery', 
      'Underscore', 
      'Backbone', 
      'collections/songlist' 
     ], 

     function ($, _, Backbone, SonglistCollection) 
     { 
      var PlaylistView = Backbone.View.extend({ 

       // properties 
       el: '#playlist', 
       collection: new SonglistCollection(), 

       /** 
       * Initialize 
       */ 
       initialize: function() 
       { 
        // load songs 
        this.collection.on('reset' , this.render, this); 
        this.collection.fetch(); 
       }, 

       /** 
       * Render 
       */ 
       render: function() 
       { 
        // loop through the collection and update the view 
       }, 

       ... 
      ); 
     } 
); 

И это моя коллекция

define(
    [ 
     'Underscore', 
     'Backbone', 
     'models/song' 
    ], 

    function (_, Backbone, songModel) 
    { 

     var songList = Backbone.Collection.extend({ 

      model: songModel, 
      url: 'song' 
     }); 

     return songList; 
    } 
); 

Как вы можете видеть, что я должен сделать новый экземпляр коллекции и повторно извлекать данные для каждого вида, где я хочу использовать данные из списка воспроизведения.

Поскольку я использую require.js, я немного потерял о том, как создавать глобальные переменные. Как мне это нравится, например. make MyApp.collections.Playlist, но я понятия не имею, как это реализовать с AMD (require.js).

Некоторые ресурсы я уже нашел, но я до сих пор потерял/запутаться/...

Большое спасибо заранее!

+1

Оба ответа на первый вопрос, который вы нашли, кажутся разумными. Настройте зависимость 'app_registry' какого-либо типа, чтобы сохранить ваше глобальное состояние или сделать это вручную с помощью' window.App = {...} 'где-то в вашей инициализации. –

ответ

1

Если у вас есть файл namespace.js: (в вашем случае myapp.js)

define([ 
    // Libraries. 
    "jquery", 
    "lodash", 
    "backbone", 

    // Plugins. 
    "plugins/backbone.layoutmanager" 
], 

function($, _, Backbone) { 

    // Provide a global location to place configuration settings 
    var namespace; 

    // ... 
    return namespace; 
}); 

Тогда в ваших модулях/Коллекции, просто импортировать этот файл, так же, как вы будете делать с другой библиотекой:

define([ 
    "namespace", 

    // Libs 
    "backbone" 
], 

function(namespace, Backbone) { 


    // This will fetch the tutorial template and render it. 
    var Playlist = namespace.collections.Playlist = Backbone.View.extend({ 
      //... 
    }); 

    // Required, return the module for AMD compliance 
    return Playlist; 

}); 

Точно так же вы можете определить маршрутизатор. И затем в отдельном main.js файл, где приложение инициализация (с использованием требуется() вместо того, чтобы определить())

кредита: это способ структурирования приложения я нашел его в tbranyen BB шаблонный: https://github.com/tbranyen/backbone-boilerplate/tree/master/app/tree

0

Почему бы просто не определить глобальные коллекции в том же файле, в котором вы запускаете приложение?

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