Ищете руководство по MVC в Backbone.js - PullRequest
2 голосов
/ 25 февраля 2012

Согласно MVC, модели представляют собой «чистое» представление данных.Вам не нужны презентационные или неСУХИЕ данные.Например, если ваша модель имеет поле «comment_count», оно также не должно содержать поле «use_plural», чтобы вы могли знать, печатать ли «comment» или «comments».

This post has 0 comments
This post has 1 comment
This post has 2 comments
...

Если выПоместить эту информацию в модель, это плохое разделение интересов, однако альтернативой является получение этой информации в представлении.Например:

var FooView = Backbone.View.extend({
  render: function(){
    this.data = this.model.toJSON();
    this.data.use_plural = this.data.comment_count === 1;
    // and fifty more lines like the above
    $(this.el).html(ich['foo_template'](this.data));
  }
});

Мой вопрос заключается в том, что существует необходимость в промежуточных данных, которые слишком видны для представления, чтобы быть частью модели, но слишком моделируют для того, чтобы быть частью представления.,Это то, что адрес MVVM?Я посмотрел это, но это выглядело очень специфично для Microsoft-tech-stack.Я думал о том, чтобы поместить его в функцию и вызвать изнутри методов render ():

function deriveData(model){
  var data = model.toJSON();
  data.use_plural = data.comment_count === 1;
  // and fifty more lines like the above
  return data;
}

var FooView = Backbone.View.extend({
  render: function(){
    this.data = deriveData(this.model);
    $(this.el).html(ich['foo_template'](this.data));
  }
});

var BarView = Backbone.View.extend({
  render: function(){
    this.data = deriveData(this.model);
    $(this.el).html(ich['bar_template'](this.data));
  }
});

Другая идея заключалась в том, чтобы иметь класс AbstractView и наследовать его, например, так:

var AbstractView = Backbone.View.extend({
  deriveData: function(){
    this.data = this.model.toJSON();
    this.data.use_plural = this.data.comment_count === 1;
    // and fifty more lines like the above
  }
});

var FooView = AbstractView.extend({
  render: function(){
    this.deriveData();
    $(this.el).html(ich['foo_template'](this.data));
  }
});

var BarView = AbstractView.extend({
  render: function(){
    this.deriveData();
    $(this.el).html(ich['bar_template'](this.data));
  }
});

Это не так много, что я в тупике, я просто хочу убедиться, что я не плыву по невежеству, пока есть эта удивительная методология, которая решает именно этот вопрос.Есть ли у кого-нибудь какие-либо рекомендации или мысли, или есть хорошо зарекомендовавшие себя образцы, которые я мог бы использовать здесь?Спасибо.

1 Ответ

4 голосов
/ 25 февраля 2012

Это личное мнение (даже если оно основано на многолетнем опыте и разделяется многими), поэтому примите его с недоверием.

Шаблон MVC просто не очень хорошо вписывается в сеть,И проблема всегда, кажется, кроется в Controller .Многие люди, которые были здесь некоторое время, знают это и молча это принимают.В большинстве фреймворков термин MVC используется как классификация , потому что в терминах шаблонов удобно объяснять, к чему стремится фреймворк, а также в большинстве других сопоставимых фреймворков используется термин.чтобы придать значение тому, кто является View , а кто Controller в Backbone, большинство людей думают, что они оба являются View.Представления генерируют шаблон, а также отправляют события из пользовательского интерфейса в модель и наоборот.Если вам действительно нужно хранить их отдельно, вы также можете подумать, что классы View - это Controllers , а шаблоны - это Views .

Надеемся, вы поняли идею не имеет значения, как вы это называете .Однако важно, как вы его используете.

Относительно практической части вашего вопроса: я бы использовал любой из них в зависимости от контекста.Это что-то маленькое, что вы используете один раз?Сделай это внутри render.Это какая-то логика, которая является частью вашей архитектуры View и необходима в нескольких представлениях?Производный от базового класса.Так же, как и со всем остальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...