2015-10-05 3 views
7

В нашем приложении «Угловое» мы имеем дело с идентификаторами, содержащими «точку». Например:Угловой ui-router с параметром запроса url, содержащим «точку»

book = { 
    id: '123.456' 
} 

У нас есть проблемы с использованием таких идентификаторов, как параметры URL. Все работает хорошо, если навигация происходит через «Угловой», а именно щелчок по ссылке, которая вызывает $state.go('bookDetails', {bookId: book.id});. Но вещи не работают при перезагрузке страницы

"не может получить /bookDetails?bookId=123.456"

в контроллере:

$scope.viewBookDetails = function() { 
    $state.go('bookDetails', {bookId: book.id}); 
} 

в представлении

<a href="" ng-click="viewBookDetails(); $event.stopPropagation();"> 

в маршрутизатор:

.state('bookDetails', { 
    url: '/bookDetails?bookId' 
} 

в браузере:

https://example.com/bookDetails?bookId=123.456 

Ссылка работает, если «точка» заменяется %2E в браузере.

Мы пытались заменить «точку» с «% 2Е» в параметре за $ state.go()

$scope.viewBookDetails = function() { 
    $state.go('bookDetails', {bookId: book.id.split('.').join('%2E')}); 
} 

, но не работает, потому что «%» автоматически кодируются и «точка» в браузере заменяется на «% 252E»

https://example.com/bookDetails?bookId=123%252E456 
+0

Может использовать sluggify для этого: https://github.com/paulsmith/angular-slugify Я не уверен, если он работает в вашем случае. – Michelangelo

ответ

5

Проблема обновления я получаю с помощью параметра URL запроса, содержащего 'точка' является проблема с сервером.
Это вызвано тем, как я справиться с html5mode (перенаправление на index.html, если это не статический ресурс) в настройках сервера хрюкать

// The original grunt server settings 
connect: { 
    options: { 
    port: 9000, 
    // Change this to '0.0.0.0' to access the server from outside. 
    hostname: 'localhost', 
    livereload: 35729 
    }, 
    livereload: { 
    options: { 
     open: true, 
     middleware: function (connect) { 
     return [ 
      require('connect-modrewrite')(['^[^\\.]*$ /index.html [L]']), //Matches everything that does not contain a '.' (period) and causes the problem 
      connect.static('.tmp'), 
      connect().use(
      '/bower_components', 
      connect.static('./bower_components') 
     ), 
      connect().use(
      '/app/styles', 
      connect.static('./app/styles') 
     ), 
      connect.static(appConfig.app) 
     ]; 
     } 
    } 
    }, 

Я изменил

require('connect-modrewrite')(['^[^\\.]*$ /index.html [L]']), 

в

require('connect-modrewrite')([ 
    '!\\.html|\\.js|\\.css|\\.svg|\\.jp(e?)g|\\.png|\\.gif|\\.ttf$ /index.html' 
]), 
1

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

http://plnkr.co/edit/Ct09Q9uoc282JuWdsO1s?p=preview

console.log("Scripts loading... "); 
 

 
// Here's a skeleton app. Fork this plunk, or create your own from scratch. 
 
var app = angular.module('demonstrateissue', ['ui.router']); 
 

 
app.controller('myController', function($scope, $state){ 
 
    $scope.book = { 
 
    id: '123.456' 
 
}; 
 
    
 
    $scope.viewBookDetails = function() { 
 
    console.log('new id'); 
 
    $state.go('bookDetails', {bookId: 456.3456}); 
 
    } 
 
}); 
 

 

 

 
// Empty config block. Define your example states here. 
 
app.config(function($stateProvider, $urlRouterProvider, $urlMatcherFactoryProvider) { 
 
    $stateProvider.state('bookDetails', { 
 
    url: '/bookDetails:bookId', 
 
    controller: function($scope, $stateParams) { 
 
     $scope.book = { 
 
     id: $stateParams.bookId 
 
     }; 
 
    }, 
 
    template: "<h3>book: {{book}}</h3>" 
 
    }); 
 

 
    $urlRouterProvider.otherwise("/bookDetails/91.23"); 
 
}); 
 

 
// Adds state change hooks; logs to console. 
 
app.run(function($rootScope, $state, $location) { 
 
    
 
    $rootScope.$state = $state; 
 
    $rootScope.$location = $location; 
 
    
 
    function message(to, toP, from, fromP) { 
 
    return from.name + angular.toJson(fromP) + " -> " + to.name + angular.toJson(toP); 
 
    } 
 
    
 
    $rootScope.$on("$stateChangeStart", function(evt, to, toP, from, fromP)  { console.log("Start: " + message(to, toP, from, fromP)); }); 
 
    $rootScope.$on("$stateChangeSuccess", function(evt, to, toP, from, fromP)  { console.log("Success: " + message(to, toP, from, fromP)); }); 
 
    $rootScope.$on("$stateChangeError", function(evt, to, toP, from, fromP, err) { console.log("Error: " + message(to, toP, from, fromP), err); }); 
 
});
body { 
 
    margin-top: 6em; 
 
} 
 
.link { 
 
    text-decoration: underline; 
 
    color: blue; 
 
} 
 

 
.link:hover { 
 
    cursor: pointer; 
 
} 
 

 
.header { 
 
    position: fixed; 
 
    right: 0; 
 
    top: 0; 
 
    height: 6em; 
 
    width: 100%; 
 
    border-bottom: 1px solid gray; 
 
}
<!DOCTYPE html> 
 
<html> 
 
    <head> 
 
    <script src="https://code.angularjs.org/1.2.25/angular.js"></script> 
 
    <script src="https://rawgit.com/angular-ui/ui-router/0.2.13/release/angular-ui-router.js"></script> 
 
    <script src="main.js"></script> 
 
    <link rel="stylesheet" href="styles.css" /> 
 
    <title>Plunk demonstrating ui-router issue</title> 
 
    </head> 
 

 
    <body ng-app="demonstrateissue"> 
 

 
     <div ui-view>ui-view not populated</div> 
 
    
 
     <div class="header"> 
 
     Current URL: <b>{{$location.url() }}</b> <br> 
 
     Current State: <b>{{$state.current.name }}</b> <br> 
 
     Current Params: <b>{{$state.params | json }}</b><br> 
 
     </div> 
 
    <br/> 
 
    <br/> 
 
    <div ng-controller="myController"> 
 
     {{book}} 
 
     <br/> 
 
     <a ui-sref="bookDetails({bookId: 6789.1011})">Change params to book with dot</a><br/> 
 
     <button ng-click="viewBookDetails()">View Book Details</button> 
 
     </div> 
 
    </body> 
 
</html>

+0

как бы вы использовали это в $ stateProvider.state()? – klode

+0

Я обновил код, пожалуйста, просмотрите и сообщите мне, где ваша ошибка. – Enkode

+0

Как я уже говорил, проблема не в состоянии, но при ** перезагрузке ** страницы bookDetails (обновляется браузер, когда на bookDetails). – klode

2

Если вы используете connect-history-api-fallback на своем сервере (например, lite-server), URL-адреса с точкой не переписываются по умолчанию.

connect-history-api-fallback code

if (parsedUrl.pathname.indexOf('.') !== -1) { 
    logger(
    'Not rewriting', 
    req.method, 
    req.url, 
    'because the path includes a dot (.) character.' 
); 
    return next(); 
} 

Начиная с версии connect-history-api-fallback1.2.0URLs with dots are allowed и вы можете решить this problem с помощью аа rewrite roule

Пример

Если URL с точкой является /api/test/:id (напр. /api/test/123.34) и вы угловатые жизни приложения в index.html странице вы можете добавить рерайт править в Connect-истории-апи-запасной вариант, как этот

rewrites: [ 
    { 
    from: /^\/api\/test\/[0-9]+\.[0-9]+$/, 
    to: 'index.html' 
    } 
    } 
] 

 Смежные вопросы

  • Нет связанных вопросов^_^