Backbone.js с Rails - PullRequest
       2

Backbone.js с Rails

7 голосов
/ 06 марта 2011

Я сейчас пробую Backbone.js вместе с приложением rails.Моя проблема в том, что я не знаю, как реализовать Backbone-контроллеры и представления с моим приложением rails.Я прочитал много уроков, но они всегда используют только один контроллер в backbone.js.

Например, у меня есть два контроллера в рельсах.

  • Activity Controller
    • Включает два вида, карту Google и поле поиска.Карта Google вставляется с видом магистрали, поле поиска в HTML и получает функциональность через просмотр магистрали.
    • Поле поиска должно извлекать данные из моей модели рельсов и отображать маркеры внутри карты.

А другой -

  • Users Controller
    • Здесь просматривается профиль пользователя, и я хочу добавить некоторые функции ajax, такие какобновление значений и прочего

В моем application.js я запускаю приложение, используя

var App = {
  Views: {},
  Controllers: {},
  Collections: {},
  init: function() {
      new App.Controllers.Activities();
      new App.Controllers.Users();
      Backbone.history.start();
  }
};

$(function() {
  App.init();
});

Проблема в том, что мне не нужноКонтроллер операций в моем профиле пользователя и контроллер Users в контроллере действий Rails.Как я мог решить это?Должен ли я попробовать прочитать текущий URL в JavaScript, а затем решить, какой контроллер используется?Или я должен поместить файл JavaScript в application.html.erb, а затем решить, какой контроллер следует использовать?

Или это неправильный способ использования контроллеров backbone.js?

AmЯ что-то не так со структурой backbone.js?Или я неправильно использую контроллеры?

Другой вопрос: как добавить немного JavaScript, в частности jQuery, через Backbone.js?Например, я хочу удалить метку внутри поля, когда пользователь нажимает на поле.Или я хочу сделать некоторые вкладки и просто переключать видимость некоторых элементов.Должен ли я создать для каждого элемента, который использует JavaScript, представление Backbone?Или это перегрузка?

Надеюсь, я ясно дал понять, и любой может помочь, спасибо!

Ответы [ 3 ]

2 голосов
/ 07 марта 2011

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

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

jQuery плагины и т. Д. Относятся к представлениям IMO. То же самое касается ваших вкладок и переключения подсказок.

Обновление

На общем уровне (и я бы не обязательно рекомендовал бы делать это так): Если у вас есть два метода:

// should be only called for the 'Foo' controller
function foo() {
  alert("FOO");
};

// should be only called for the 'Bar' controller
function bar() {
  alert("BAR");
};

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

например. в вас * helpers / application_helper.rb *

def body_class
  controller.controller_name
end

затем вызовите этот метод в файле макета (или в частичном заголовке):

<body class="<%= body_class %>">
…

и используйте, например, jQuery для «разделения» вашего выполнения JS:

if ($('body').hasClass('foo')) {
  foo();
} else if ($('body').hasClass('bar')) {
  bar();
} 
1 голос
/ 07 марта 2011

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

Контроллеры Backbone.js в основном состоят из маршрутов hashbang (аналогичных маршрутам Rails) и действий, которые вызывают эти маршруты.Например, если у вас есть маршрут рельсов, который будет отображать представление в http://mysite.com/backbone_test, и у вас есть следующий магистральный маршрут:

var MyController = Backbone.Controller.extend({
  routes: {
    "foo/:bar":            "myFirstFunction"
  },
  myFirstFunction: function(bar){
    console.log(bar);
  });

, тогда, если вы перейдете к http://mysite.com/backbone_test#foo/THIS-IS-AMAZING, тогда MyController.MyFirstFunction выполняется, и в консоли JS регистрируется «THIS-IS-AMAZING».

Если у вас нет прямой необходимости в такого рода функциях, связанных с hashbang, таких как сохранение состояния вашего приложения JavaScript через приложение JavaScript.url (например: http://my.app.com/#key=value&key=value&ad-infinitum=true) Id не рекомендуется использовать контроллеры Backbone.Вы можете получить все описанные вами функции через Коллекции и представления моделей.

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

Полагаю, что краткое изложение этого ответа таково: если у вас нет одностраничного приложения javascript, не используйте Backbone Controllers, вместо этого положитесь на ваши контроллеры rails.

1 голос
/ 07 марта 2011

Я лично использую jammit (от того же автора основы). Вы можете группировать таблицы стилей и файлы javascripts по модулям и использовать их на разных страницах. Таким образом, вы создаете модуль для вашего вида деятельности и другой для вашего пользователя, каждый из которых требует необходимый файл JavaScript. Две хорошие вещи об этом:

  • у вас есть только код, использованный на странице, загруженной на страницу
  • jammit предлагает все для вас

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

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