2017-01-05 3 views
9

Я бы хотел отключить кодировку url.angular 2 disable url encoding

Когда я использую это ниже.

this.router.navigate(['/profile', { tags: 'one,two' }]); 

URL-адрес, как это

http://localhost:4200/profile;tags=one%2Ctwo 

Я хотел бы, чтобы это было довольно, как показано ниже

http://localhost:4200/profile;tags=one,two 

Есть ли способ отключить кодировку URL?

+0

проверить это http://stackoverflow.com/questions/22944932/angularjs-resource-how-to-disable-url-entity-encoding – Deep

+0

@Deep, ваша ссылка для углового 1, что немного отличается. – Derrick

ответ

17

Угловой2 по умолчанию использует encodeURIComponent() для кодирования URL-адресов запроса в URL-адресе, вы можете избежать этого, написав собственный сериализатор URL-адресов и переопределив функциональные возможности по умолчанию.

В моем случае я хотел избежать Angular2, чтобы избежать замены запятой (,) на (% 2). Я передавал Query как lang = en-us, en-uk, где он преобразовывался в lang = en-us% 2en-uk.

Вот как я работал его:

CustomUrlSerializer.ts

import {UrlSerializer, UrlTree, DefaultUrlSerializer} from '@angular/router'; 

export class CustomUrlSerializer implements UrlSerializer { 
    parse(url: any): UrlTree { 
     let dus = new DefaultUrlSerializer(); 
     return dus.parse(url); 
    } 

    serialize(tree: UrlTree): any { 
     let dus = new DefaultUrlSerializer(), 
      path = dus.serialize(tree); 
     // use your regex to replace as per your requirement. 
     return path.replace(/%2/g,','); 
    } 
} 

Добавить ниже линии вашего основного appModule.ts

import {UrlSerializer} from '@angular/router'; 
import {CustomUrlSerializer} from './CustomUrlSerializer'; 

@NgModule({ 
    providers: [{ provide: UrlSerializer, useClass: CustomUrlSerializer }] 
}) 

Это не нарушит ваш по умолчанию функциональность и заботиться о URL-адресе в соответствии с вашими потребностями.

+0

Wow, thats awesome, большое вам спасибо! – Jason

+0

Вместо вызова DefautlUrlSerializer в обоих методах будет расширять работу DefautlUrlSerializer? Я считаю, что это будет более простой и понятный подход. –

+0

@ EnzamHossain Да, мы можем пойти на более чистый подход, создав один экземпляр и используя его. –

-1

URL-адрес выглядит следующим образом:

http://localhost:4200/profile;tags=one%2Ctwo 

Но это не принесет никакой проблемы, если вы потребляете его. Если, для «профиль» маршрут, установить охрану «» canActive с кодом, как следующее:

canActivate(route: ActivatedRouteSnapshot) { 
    console.log(route.params);} 

И когда вы навигации к http://localhost:4200/profile;tags=one%2Ctwo, вы увидите {tag: one, two} в консоли. Поэтому, когда вы его потребляете, это «один, два». И, конечно же, вы можете скопировать этот закодированный URL-адрес и отправить другим пользователям.

+0

Привет, я ценю, что он функционирует без каких-либо проблем, я пытался найти решение, которое делает URL привлекательным или привлекательным для чтения. – Jason

+0

Я читаю это, потому что кодирование действительно вызывает проблемы – BenRacicot