2015-05-19 2 views
0

Я создаю одностраничное приложение, которое позволяет пользователям фильтровать данные по двум критериям (Навыки и местоположение). Эти данные должны быть заполнены из двух отдельных веб-сервисов.Коллекция несвязанных моделей в магистрали?

Для каждой службы используется модель для использования данных с использованием запросов стиля REST.

enter image description here

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

 var Movies = Backbone.Collection.extend({ 
     model: Movie, 
     initialize: function() { 
      console.log(""); 
      console.log("Movie Collection initialize"); 
      console.log(this); 
      console.log(this.length); 
      console.log(this.models); 
     } 
    }); 

    var movie1 = new Movie({ 
     "title": "Bag It", 
     "averageUserRating": 4.6, 
     "yearReleased": 2010, 
     "mpaaRating": "R" 
    }); 

    var movie2 = new Movie({ 
     "title": "Lost Boy: The Next Chapter", 
     "averageUserRating": 4.6, 
     "yearReleased": 2009, 
     "mpaaRating": "PG-13" 
    }); 

Однако я пытаюсь реализовать рисунок ниже, где коллекция имеет две Модели. Является ли это анти-шаблоном для Backbone. Как это следует решать?

define([ 
    'underscore', 
    'backbone', 
    'models/locationsModel', 
    'models/skillsModel' 
], function (_, Backbone, Location, Skills) 
{ 
    'use strict'; 

    var FiltersCollection = Backbone.Collection.extend({ 

     // The filters collection requires these two models that will provide data to the filters view 
     location: new Location(), 
     skills: new Skills(), 

     initialize: function() { 
      //Do stuff 
    } 
    }); 

    return new FiltersCollection(); 
}); 
+1

отдельных коллекций для каждого типа модели; один вид, который отображается из каждой коллекции соответствующим образом –

ответ

1

Я не могу сообщить, что лучше для вас, потому что я не могу правильно визуализировать ваши данные на основе предоставленной информации. Но если вы соблюдаете конструктор коллекции в источнике Backbone:

if (options.model) this.model = options.model; 

Тогда в _prepareModel:

var model = new this.model(attrs, options); 

И мы знали, что «модель» является функция в любом случае, и функция может возвращать то, что вы хотите , Таким образом, обеспечивая ваши два различных источника данных имеют некоторые атрибуты, которые могут идентифицировать их, вы можете сделать что-то вроде этого:

var SkillModel = Backbone.Model.extend({ 
 
    sayMyName: function() { 
 
     return 'I am a skill model and I am skilled at ' + this.get('name'); 
 
    } 
 
}); 
 

 
var LocationModel = Backbone.Model.extend({ 
 
    sayMyName: function() { 
 
     return 'I am a location model and I am relaxing in ' + this.get('name'); 
 
    } 
 
}); 
 

 
function FilterModel(attrs, options) { 
 
    if (attrs.type === 'skill') { 
 
     return new SkillModel(attrs, options); 
 
    } else if (attrs.type === 'location') { 
 
     return new LocationModel(attrs, options); 
 
    } 
 
} 
 

 
var FilterCollection = Backbone.Collection.extend({ 
 
    model: FilterModel 
 
}); 
 
    
 
var filteredCollection = new FilterCollection([{ 
 
    type: 'skill', 
 
    name: 'carpentry' 
 
}, { 
 
    type: 'location', 
 
    name: 'India' 
 
}, { 
 
    type: 'skill', 
 
    name: 'plumbing' 
 
}]); 
 

 
var outputEl = document.querySelector('#output'); 
 

 
filteredCollection.each(function(model) { 
 
    outputEl.innerHTML += '<p>' + model.sayMyName() + '<p>'; 
 
});
<script src="http://underscorejs.org/underscore.js"></script> 
 
<script src="http://backbonejs.org/backbone.js"></script> 
 

 
<div id="output"></div>

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