当前位置:  开发笔记 > 编程语言 > 正文

Angular和Sails路由配置

如何解决《Angular和Sails路由配置》经验,为你挑选了1个好方法。

是否有任何Sails.js(或节点)配置可以阻止Angular路由工作?

无论我采取什么样的方法,除了帆的路线之外的每一次溃败都会返回404.

我已经尝试了1.2和1.3 Angular版本,我正在使用Sails v 0.9.15.

所有脚本都以正确的顺序加载(例如):





...

我正确使用ngRoute:

var myApp= angular.module('myApp', ['ngRoute']);

这是我在Angular的app.js中的路线:

myApp.config(['$routeProvider', function ($routeProvider) { 

$routeProvider
    .when('/profile',
        { templateUrl: 'linker/views/profile.html', controller: 'MainCtrl' })
    .when('/profile-detail',
        { templateUrl: 'linker/views/profile_detail.html', controller: 'MainCtrl' });
}]);

我也在使用位置提供商:

myApp.config(function ($locationProvider) {
    $locationProvider.html5Mode(true);
});

额外细节:

ng-app和ng-view被正确放置,我的路径是正确的.我可以使用Angular正确显示profile.html(并且还包括来自Sails的Restful API的数据).

问题是,我只能对Sails的routes.js中定义的路由执行此操作.

例:

module.exports.routes = {
  '/' : {
    controller: 'main',
    action: 'index'
  },
  '/signup' : {
    controller: 'main',
    action: 'signup'
  },
  '/login' : {
    controller: 'main',
    action: 'login'
  },
  '/profile': {
    controller: 'users',
    action: 'profile'
  } //......

所以基本上,为了用Angular显示一些html内容,我必须在Sails的配置中完全定义相同的路由,这没有任何意义.

有任何想法吗?PS如果需要,我会提供额外的数据.



1> Jonas..:

尝试删除html5模式,看看会发生什么:

$locationProvider.html5Mode(false);

如果您仅使用sails应用程序为Angular应用程序提供API,但是您使用相同的后端来提供角度代码,那么您可以在所有API路径前加上'api',以防止与角度路径发生冲突.

而不是/ profile你会有/ api/profile


编辑: 我已经看了Sails.js框架并制作了一个小应用程序来测试它.

我能够成功地在角度工作中获得未被帆定义的路线.

我认为对角度路由的工作方式存在误解.

如果使用window.location更改路径或手动键入URL,浏览器将向服务器发送get请求.因此,在您的情况下,将会有/ profile或/ profilee的请求,服务器将查看可用的路由,如果没有匹配则将抛出404.

为了防止这种情况,您应该使用angular方法实际更改路径.Angular 在路径中使用"#"符号来阻止浏览器在URL更改时向服务器发送请求.浏览器忽略'#'符号后的更改.或者在您的情况下,使用html5模式可以实现类似的效果.请注意,当用户刷新页面时,使用html5模式会导致麻烦,从那时起将向服务器发出请求(更多关于如何修复下面的内容).

那么,你应该使用javascript更改路径的是$ location服务.在你的角度视图中,你也可以使用普通的锚标签,因为angular会解析那些:

Go to profile

由于您拥有的是单页面应用程序,因此所有视图都由客户端处理.超出根(/)的所有路径都是由angular创建的虚拟路径.它们通常不存在于服务器中.只有root可用.使用html5模式时可能会出现问题.

解决这个问题的一种方法是重写服务器的路由以服务其他所有内容,就像它是对根路径的请求一样.在sails中,他们甚至建议如何在config/routes.js中执行此操作:

  // What about the ever-popular "vanity URLs" aka URL slugs?
  // (you might remember doing this with `mod_rewrite` in Apache)
  //
  // This is where you want to set up root-relative dynamic routes like:
  // http://yourwebsite.com/twinkletoez
  //
  // NOTE:
  // You'll still want to allow requests through to the static assets,
  // so we need to set up this route to ignore URLs that have a trailing ".":
  // (e.g. your javascript, CSS, and image files)
  'get /*(^.*)': 'UserController.profile'

关于sail中的API,您可以在config/controllers.js文件中配置前缀:

/**
 * `prefix`
 *
 * An optional mount path for all blueprint routes on a controller, including `rest`, 
 * `actions`, and `shortcuts`.  This allows you to continue to use blueprints, even if you
 * need to namespace your API methods.
 *
 * For example, `prefix: '/api/v2'` would make the following REST blueprint routes
 * for a FooController:
 *
 * `GET /api/v2/foo/:id?`
 * `POST /api/v2/foo`
 * `PUT /api/v2/foo/:id`
 * `DELETE /api/v2/foo/:id`
 *
 * By default, no prefix is used.
 */
prefix: '',

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有