Angular 给出了一个奇怪的 templateURL

Posted

技术标签:

【中文标题】Angular 给出了一个奇怪的 templateURL【英文标题】:Angular giving a weird templateURL 【发布时间】:2018-01-29 17:47:50 【问题描述】:

我正在尝试使用选定的 objectID 导航到另一个页面。 角度路由,

var myApp = angular.module('myApp', ['ngRoute']);
myApp.config(function($routeProvider)
$routeProvider.when('/',
    controller: 'BooksController',
    templateUrl: 'views/books.html'
)  
.when('/books/details/:id',
    controller: 'BooksController',
    templateUrl: 'views/book_details.html'
)   
);

角度控制器:

    var myApp = angular.module('myApp');

myApp.controller('BooksController', ['$scope', '$http', '$location', '$routeParams', function($scope, $http, $location, $routeParams)
  console.log('BooksController loaded...');

 // This To get request all the books: it works fine   
  $scope.getBooks = function()
    $http.get('/api/books').then(function(response)
      $scope.books = response.data;
    );
  

   // This to get request a book with specific id it works fine
  $scope.getBook = function()
    var id = $routeParams.id;
    $http.get('/api/books/'+id).then(function(response)
      $scope.book = response.data;
    );
  

]);

然后我有这个 html 页面,它也可以正常工作,接受页面中的按钮,这个按钮应该给我一个干净的 templateUrl 来导航到另一个 html 页面,但它给了我奇怪的 URL:

<div class="panel panel-default" ng-init="getBooks()">
<div class="panel-heading">
  <h3 class="panel-title">Latest Books</h3>
</div>
<div class="panel-body">
  <div class="row">
      <div ng-repeat="book in books">
          <div class="col-md-6">
              <div class="col-md-6">
                  <h4>book.title</h4>
                  <p>book.description</p>
                  <a class="btn btn-primary" href="#/books/details/book._id">View Details</a>
              </div>
              <div class="col-md-6">
                  <img class="thumbnail" src="book.image_url">
              </div>
          </div>
      </div>
  </div>
</div>

一旦我按下按钮,我应该得到一个干净的网址,例如: http://localhost:3000/#!/books/details/599701c1f3da51117535b9ab 但相反,我得到了这个网址! http://localhost:3000/#!/#%2Fbooks%2Fdetails%2F599701c1f3da51117535b9ab

【问题讨论】:

【参考方案1】:

您在 url 中有前缀,它正在转换为字符,即 url 编码。 所以你需要修复 $locationProvider 的 hashPrefix 属性,将其值替换为空/空白字符串

     $locationProvider.hashPrefix('');

【讨论】:

【参考方案2】:

好像你有哈希前缀!,那么你的网址也应该在哈希后有!(#)

href="#!/books/details/book._id"

由于 Angular 1.6 hashprefix 默认为 !,您可以通过将 hashPrefix 设置为 ''(空白)来禁用此行为。

.config(['$locationProvider', 
  function($locationProvider) 
     $locationProvider.hashPrefix('');
  
]);

【讨论】:

感谢队友,我在这个问题上挣扎了大约 3 个小时!! @AbdallahRizk 很高兴知道这有帮助,谢谢 ;)【参考方案3】:

这是因为您的网址正在转换为代码。 %2f 表示 /。

你需要有这个配置来避免这种角度的行为

myApp.config(['$locationProvider', function($locationProvider) 
  $locationProvider.hashPrefix('');
]);

【讨论】:

以上是关于Angular 给出了一个奇怪的 templateURL的主要内容,如果未能解决你的问题,请参考以下文章

npm install 给出警告,npm audit fix 不起作用

[Angular Tutorial] 1-Static Template

Angular 2 @View with template vs @Component with template

Angular 2 @View with template vs @Component with template

Angular 和 Spring Boot 应用程序上的奇怪图标

Angular2:angular-http 标头非常奇怪的行为