Фильтр массива не работает, когда ng serve / build - приложение Angular 7 - PullRequest
0 голосов
/ 24 апреля 2019

У меня очень странная проблема с приложением Angular CLI 7, где все работает правильно при запуске «ng serve».Но при запуске "ng serve --prod".Я не получаю никаких ошибок при обслуживании или создании приложения.Точная проблема с array.filter (x => x.id === myVariable)

Я пытался запустить приложение с --aot = false, --build-optimizer = false, кажется, ничего не помогаети всякий раз, когда добавляется флаг prod для обслуживания или сборки array.filter не работает.

Вот детали окружения:

Angular CLI: 7.0.4
Node: 8.10.0
OS: linux x64
Angular: 

Package                      Version
------------------------------------------------------
@angular-devkit/architect    0.10.4
@angular-devkit/core         7.0.4
@angular-devkit/schematics   7.0.4
@schematics/angular          7.0.4
@schematics/update           0.10.4
rxjs                         6.3.3
typescript                   3.1.3

angular.json:

"configurations": {
        "production": {
          "fileReplacements": [
            {
              "replace": "src/environments/environment.ts",
              "with": "src/environments/environment.prod.ts"
            }
          ],
          "optimization": false,
          "outputHashing": "all",
          "sourceMap": false,
          "extractCss": true,
          "namedChunks": false,
          "aot": true,
          "extractLicenses": true,
          "vendorChunk": false,
          "buildOptimizer": true,
          "budgets": [
            {
              "type": "initial",
              "maximumWarning": "2mb",
              "maximumError": "5mb"
            }
          ]
        },

Вот мой код дьявола:

searchUser(id: number) {
 const user = this.usersList.filter(x => x.id === id);
 console.log(user);
 return user;
}

userList is Arrayобъектов Json, таких как:

[
{id: 1, name: "John"},
{id: 2, name: "Mary"},
etc...
]

При запуске приложения с "ng serve" searchUser возвращает правильный пользовательский объект и печатает объект пользователя на консоли.

При запуске приложения с "ng serve --prod"ничего не возвращено, журнал консоли показывает просто Undefined.

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

спасибо!

Ответы [ 3 ]

0 голосов
/ 24 апреля 2019

Это произошло, вероятно, потому что во время обращения к переменной this.usersList было нулевым, неопределенным или значением, отличным от массива.Вы можете сначала преобразовать значение в массив и быть уверенным, что функция фильтра будет доступна в любое время.

<Array>(this.usersList).filter(....)

или

<Array<object>>(this.usersList).filter(....)

Кроме того, вы можете проверить наличиезначение this.usersList first

let user;
if(Array.isArray(this.usersList)){
   user = this.usersList.filter(....)
}
0 голосов
/ 01 мая 2019

О, боже, глупая ошибка, которую я допустил.

searchUser(id: number) {
const user = this.usersList.filter(x => x.id === id);

Это был старый код, с немного другой причиной, неработающий был:

searchUser(user) {
...

, где пользователь - объекти user.id, который я распечатал на консоли, действительно был виден как некоторое число, но фактический тип был string.поэтому изменилось на:

const user = this.usersList.filter(x => x.id === +id);

, который добился цели.Что-то, что я, вероятно, сейчас запомню навсегда, проверь типы переменных!Еще спасибо, что подумали.

0 голосов
/ 24 апреля 2019

Есть две возможности:

1) Перед функцией .filter, пожалуйста, проверьте, есть ли данные в usersList или нет.(Может быть, это вызов службы и не обрабатывается должным образом).2) Пожалуйста, определите userList как тип массива:

usersList: Array<object>;

...