Лучший шаблон дизайна для смешанной коллекции в Backbone.js - PullRequest
2 голосов
/ 24 декабря 2011

У меня есть коллекция элементов, у которых у всех есть общие данные (например, идентификатор, заголовок), но за пределами общего набора атрибутов они являются функционально уникальными элементами и имеют отдельные представления и бизнес-логику.

Моя проблема заключается в том, что у меня нет опыта работы с MVC в стиле Backbone, я не знаю плюсов и минусов каждого ... или, может быть, я пропускаю более элегантное решение. Вот пример 3 техник, которые я мог бы использовать?

var gizmoCollection = new Backbone.Collection(); // or extend
var gizmoModel = Backbone.Model.extend({ ... });

var morgView = Backbone.View.extend({ ... });
var blarView = Backbone.View.extend({ ... });


// 1.)  Create an attribute for the view in the model?
gizmoCollection.add(new gizmoModel({ title: 'Gizmo1': view: morgView }));
gizmoCollection.add(new gizmoModel({ title: 'Gizmo2': view: blarView }));


// 2.)  Or create a seperate model for each type of model?
var morgModel = morgModel.extend({});
var blarModel = blarModel.extend({});

gizmoCollection.add(new morgModel({ title: 'Gizmo1' });
gizmoCollection.add(new blarModel({ title: 'Gizmo2' });


// 3.  Or register 'types' of views?
gizmoView.subClassView('morg', morgView);
gizmoView.subClassView('blar', blarView);
gizmoCollection.add(new gizmoModel({ title: 'Gizmo1', type: 'morg' });
gizmoCollection.add(new gizmoModel({ title: 'Gizmo2', type: 'blar' });

1 Ответ

1 голос
/ 24 декабря 2011

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

Вы должны иметь в виду следующее:

  1. Логика представления переходит к Presenter (s) (Backbone.View)
  2. Бизнес-логика в модели (Backbone.Model)
  3. Логика навигации либо маршрутизатор (он же контроллер), либо вы можете создать свою шину событий из Backbone.Events или jQuery.callbacks (), которая будет выполнять эту работу и, возможно, некоторые другие вещи, которые вы хотите отделить от ваших докладчиков и моделей.

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

...