Javascript AngularJS和ui视图导致无限递归

Javascript AngularJS和ui视图导致无限递归,javascript,ruby-on-rails,ruby,angularjs,angular-ui,Javascript,Ruby On Rails,Ruby,Angularjs,Angular Ui,我正在RubyonRails4上构建一个AngularJS应用程序。到目前为止,我只是拼凑了一些基本知识。下面是一个简单的配置/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.

我正在RubyonRails4上构建一个AngularJS应用程序。到目前为止,我只是拼凑了一些基本知识。下面是一个简单的配置/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 %>;">
现在,如果我不将任何标记放入
app/views/home/index.html.erb
,就不存在无限递归问题。当我将其添加到应用程序中时,应用程序就完全爆炸了:


我不知道如何使用
ui视图
容器引导我的应用程序,以便AngularJS可以填充其余的模板。不完全确定是什么导致了这种无限递归。这是一个已知的问题吗?

目前,Angularjs不支持多个
ng view
指令


因此,正确的方法是将
放在根html
application.html.erb
中,并且
index.html.erb
将在根html模板的
ui视图中呈现

只是有一个原因稍有不同的类似问题:我的routeProvider中缺少一个模板。但是.htaccess没有抛出错误,而是导致index.html被服务,导致无限递归。

我遇到了一个类似的问题,但根本原因不同。对我来说,我通过设置
$locationProvider.html5Mode(true)
启用了HTML5模式,同时在我的routes.rb中设置了一个catch-all
get'*path',to:'application#index'
,其中
application#index
与包含
元素的模板相同。以前,angular在URL中使用哈希标记命名路由,但在HTML5模式中不再如此,因此当ui视图试图从
/
(以前是
#/
)获取其模板时,由于
获取“*a”,它被Rails覆盖,到:“home#index”
,因此整个初始Rails模板被重新加载到ui视图下


我使用angular rails模板,发现我仍然需要使用
/assets/
,例如
templateUrl:/assets/myTemplate.html

templateUrl
s作为前缀,但是这个application.html.erb是由默认的Ruby on rails布局提供的,还是由AngularJS提供的模板?我不知道这是怎么回事。我所看到的示例应用程序都不是功能齐全的。Angularjs有独立的带路由的MVC。因此,您只需要一个“普通”web服务器。如果使用任何模板引擎,应该只让视图引擎呈现根html,对于其他部分页面,路由应该由纯angularjs处理。希望能有所帮助。但这正是Rails所服务的“根”html,在本例中是application.html.erb。这必须有标记,否则AngularJS将不知道如何使用它。无限循环是由AngularJS引起的,当你在一个分部中放入一个将在你的根html页面中呈现的。
MyApp.config(function($stateProvider, $urlRouterProvider){

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


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