AngularJS и ui-view вызывают бесконечную рекурсию

Я создаю приложение AngularJS поверх Ruby on Rails 4. Пока я только собрал основы. Вот тривиальный файл config/routes.rb:

MyApp::Application.routes.draw do
  devise_for :users

  root :to => 'home#index'

  namespace :api do
  end

  get '*a', to: 'home#index' 

end

У меня есть тривиальный макет application.html.erb, и он помечен для AngularJS с помощью этой выдержки:

<html ng-app="MyApp" ng-init="current_user = <%= current_user.to_json %>;">

На стороне Angular у меня есть простая настройка маршрута с использованием ui-router:

MyApp.config(function($stateProvider, $urlRouterProvider){

      $stateProvider
        .state('login', {
                url: '/login',
                templateUrl: 'index.html.erb' })


      // For any unmatched url
      $urlRouterProvider.otherwise('/login');
});

Теперь, если я не добавлю никакой разметки в app/views/home/index.html.erb, проблемы бесконечной рекурсии не будет. В тот момент, когда я добавляю это в него, приложение просто полностью взрывается:

<div ui-view></div>

Я не уверен, как загрузить мое приложение с помощью контейнера ui-view, чтобы AngularJS мог заполнить остальную часть шаблона. Не совсем уверен, что вызывает эту бесконечную рекурсию. Это известная проблема?


person randombits    schedule 30.07.2013    source источник


Ответы (3)


Прямо сейчас Angularjs не поддерживает несколько директив ng-view.

Таким образом, правильный способ - поместить <div ui-view></div> в корневой HTML-код application.html.erb, а index.html.erb будет отображаться в ui-view корневого HTML-шаблона.

person zs2020    schedule 30.07.2013
comment
Но обслуживается ли этот application.html.erb макетом Ruby on Rails по умолчанию или это шаблон, обслуживаемый AngularJS? Запутался, как это будет работать. Ни одно из примеров приложений, которые я видел, не является полностью функциональным. - person randombits; 30.07.2013
comment
Angularjs имеет автономный MVC с маршрутизацией. Так что вам нужен только простой веб-сервер. Если вы используете какой-либо механизм шаблонов, вы должны позволить механизму просмотра отображать только корневой HTML-код, а для других частичных страниц маршрутизация должна обрабатываться чистым angularjs. Надеюсь, поможет. - person zs2020; 30.07.2013
comment
Но это именно то, что обслуживает Rails, корневой html, в данном случае application.html.erb. В нем должна быть разметка ‹div ui-view›, иначе AngularJS не будет знать, как с ним работать. - person randombits; 30.07.2013
comment
Бесконечный цикл возникает из-за angularjs, когда вы помещаете ‹ui-view› в партиал, который будет отображаться в ‹ui-view› на вашей корневой html-странице. - person zs2020; 30.07.2013

Просто была похожая проблема с немного другой причиной: отсутствующий шаблон в моем routeProvider. Но вместо того, чтобы выдать ошибку, .htaccess вызвал обслуживание index.html, что привело к бесконечной рекурсии.

person Sjeiti    schedule 10.01.2014

У меня была аналогичная проблема с другой первопричиной. Для себя я включил режим HTML5, установив $locationProvider.html5Mode(true), а также задав универсальный get '*path', to: 'application#index' в файле route.rb, где application#index был тем же шаблоном, который содержал мой элемент <div ui-view></div>. Принимая во внимание, что раньше angular размещал маршруты в URL-адресе с хэштегом, в режиме html 5 это уже не так, поэтому, когда пользовательский интерфейс пытался получить свой шаблон из / (ранее #/), он был переопределен Rails из-за на get '*a', to: 'home#index', и поэтому весь первоначальный шаблон Rails был перезагружен под ui-view.

Я использовал шаблоны angular-rails и обнаружил, что мне все еще нужно префикс templateUrls с /assets/, например. templateUrl: /assets/myTemplate.html

person Amy.js    schedule 11.05.2015