Есть ли причина, по которой я должен избежать этого в Backbone.js?

StackOverflow https://stackoverflow.com/questions/4412166

  •  08-10-2019
  •  | 
  •  

Вопрос

Я наслаждаюсь Backbone.js все больше и больше. Я желаю, чтобы иметь несколько просмотров для данной модели:

  • Вид из списка, где каждая модель имеет вид с собственным элементом Li.
  • Подробный вид, показывающий все детали модели.

Мой вопрос в том, я искал хороший способ позволить одному представлению общаться с другим и избран следующим:

/** Allow a model to keep track of it's views. **/
Backbone.Model.prototype.addView = function (view) {
    // Ensure our model has a view array.
    if (typeof this.views === 'undefined')
    {
        this.views = [];
    }

    // Append our newest view to the array only if it is not already present.
    if (_.indexOf(this.views, view) === -1)
    {
        this.views.push(view);
    }
}

/** Allow a model to remove all of it's views.
 * 
 * @param {Object} args Any arguments will be provided to the view's method.
 */
Backbone.Model.prototype.unloadViews = function (args) {
    var n = (typeof this.views === 'undefined') ? 0 : this.views.length;
    for (var i = 0; i < n; i++)
    {
        var view = this.views[i];
        if (typeof view.unloadView === 'function')
        {
           view.unloadView(args);
        }
    }
}

/** Allow a model to re-render all of it's views.
 * 
 * @param {Object} args Any argyments will be provided to the view's method.
 */
Backbone.Model.prototype.renderViews = function (args) {
   var n = (typeof this.views === 'undefined') ? 0 : this.views.length;
   for (var i = 0; i < n; i++)
   {
        var view = this.views[i];
        if (typeof view.render === 'function')
        {
            view.render(args);
        }
   }
}

Мои вопросы

  1. Я что-то упускаю, как я изучаю backbone.js, что позволит мне сделать это естественно?
  2. Есть ли причина, по которой я должен избежать этого?

Дополнительная информация

Я поделился приложением (довольно элементарным) на Github: https://github.com/aarongreenlee/learning-backbone.js.. Отказ Если вы предпочитаете увидеть код в этой среде, вы можете получить доступ к нему здесь: https://github.com/aarongreenlee/learning-backbone.js/commit/ea4e61d934d2f987726720e81c479f9d9bb86e09#diff-2. (Первоначальный коммит).

Спасибо за ваше время и помощь!

Это было полезно?

Решение

Ну, ваши взгляды могут иметь дерево, как ссылка, но ваша модель не должна знать о ваших взглядах!

Вы должны установить свой вид на прослушивание событий из моделей, и их реагируют соответственно (рендеринг, который есть).

Таким образом, вы избегаете перекрестной ссылки между нижними частями вашего программного обеспечения (тот, который должен быть солидной, моделью) и более высокими деталями, представлениями. Классическое разделение MVC.

Итак, переместите свои addViews, вернитесь к Backbone.View, и это должно быть хорошо. Вы будете создавать иерархический вид на вид, что очень похоже на то, что предлагает Sproccore.

Повеселись!

Другие советы

Ответ вошел из Twitter от Джереми Ашкенаса облака документа

@aarongreenlee Нет причин избежать этого - если вы хотите, чтобы ваши взгляды сохраняли дерево, похожему на другую, это, безусловно, легит. - @ Jashkenas

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top