Ionic 2, использование разрывов каналов Angular 2 на iOS — не удается найти переменную: Intl

Возникла та же проблема с конвейерами даты, процентов и валюты при использовании их в шаблоне —

Например, я использую простой процентный канал:

{{ .0237| percent:'1.2-2' }}

Он работает при работе в Chrome, но когда я развертываю его на устройстве iOS, он выдает эту ошибку:

«ИСКЛЮЧЕНИЕ: ReferenceError: не удается найти переменную: Intl в [{{ {{ .0237| процентов: '1.2-2' }} ..."

Кто-нибудь еще столкнулся с этой проблемой? Любые предложения или помощь будут очень признательны! Спасибо!


person Hunter    schedule 26.01.2016    source источник


Ответы (4)


Это связано с тем, что он использует API интернализации, который в настоящее время доступен не во всех браузерах (например, не в браузере iOS).

См. таблицу совместимости.

Это известная проблема (бета-версия 1).

Вы можете попробовать использовать полифилл для Intl.

Для этого вы можете использовать версию CDN и добавить это в свой index.html:

<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en"></script>

Или, если вы используете Webpack, вы можете установить модуль Intl с помощью NPM:

npm install --save intl

И добавьте эти импорты в свое приложение:

import 'intl';
import 'intl/locale-data/jsonp/en';
person cexbrayat    schedule 26.01.2016
comment
я рекомендую установить через npm, потому что, если у вас есть проблема с сетью, вы не можете получить доступ к polyfill через Интернет, и приложение показывает пустой экран. - person vuhung3990; 09.09.2016
comment
Добавьте два оператора импорта в ваш файл polyfills.ts, если вы используете настройку сборки CLI. - person Per Hornshøj-Schierbeck; 28.09.2016
comment
Я искал эту ошибку в течение нескольких дней, когда ngFor не обновлялся правильно на iOS9.3.1.1 из-за этой ошибки JS, которую я нашел в Safari. Я могу подтвердить слова @davidfischer. - person vr_driver; 15.05.2018

Для этого есть быстрое решение. Добавлять

<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en"></script>

в файл index.html перед записью <script src="cordova.js"></script>.

См. этот ответ github https://github.com/angular/angular/issues/3333#issuecomment-203327903

person Stevo    schedule 31.03.2016

Или другим решением было бы написать эти каналы самостоятельно. Для даты, например, можно использовать moment.js, или вот пример для валютной трубы:

import { Pipe, PipeTransform } from '@angular/core'

@Pipe({ name: 'currency' })

export class CurrencyPipe implements PipeTransform {
    constructor() {}

    transform(value: string, currencyString: string ) { 
        let stringOnlyDigits  = value.replace(/[^\d.-]/g, '');
        let convertedNumber = Number(stringOnlyDigits).toFixed(2);
        return convertedNumber + " " + currencyString;
    }
} 

Эта труба преобразует валюту. Процентная трубка будет работать почти так же. Регулярное выражение фильтрует все цифры, включая точку для чисел с плавающей запятой.

person Highriser    schedule 09.11.2016

Вот что я сделал с RC3. Я думаю, что это будет работать и с RC4.

Создайте канал, набрав ionic g pipe pipe-transform

Очистите код, чтобы удалить @Injectable. Кроме того, используйте верблюжий регистр, чтобы назвать его, как показано ниже. Реализовать PipeTransform.

import { Pipe, PipeTransform} from '@angular/core';

/**
 * Takes a number and transforms into percentage upto
 * specified decimal places
 *
 * Usage:
 * value | percent-pipe: decimalPlaces
 *
 * Example:
 * 0.1335 | percent-pipe:2
*/
@Pipe({
  name: 'percentPipe'
})
export class PercentPipe implements PipeTransform {
  /**
   * Takes a number and returns percentage value
   * @param value: number
   * @param decimalPlaces: number
   */
  transform(value: number, decimalPlaces:number) {
    let val = (value * 100).toFixed(decimalPlaces);
    return val + '%';
  }
}

В вашем app.module добавьте к declarations массиву.

Затем в html используйте его, как в примере выше. Вот мой пример

 <ion-col *ngIf="pd.wtChg < -0.05  || pd.wtChg > 0.05" width-25 highlight>
    {{pd.wtChg | percentPipe: 2}}
  </ion-col>

Обратите внимание, что я использую *ngIf и директиву выделения на тот случай, если кому-то понадобится дополнительная помощь. Не обязательно явно.

Результирующее изображение

person Mukus    schedule 04.01.2017