Подтвердить что ты не робот

GET http://localhost: 4200/null 404 (не найдено) в angular2 с angular -cli

Я работаю с проектом angular2 с angular -cli. Сегодня я обновил версию ниже до 2.4.1.

"@angular/common": "~2.4.1",
"@angular/compiler": "~2.4.1",
"@angular/compiler-cli": "^2.4.1",
"@angular/core": "~2.4.1",
"@angular/forms": "~2.4.1",
"@angular/http": "~2.4.1",
"@angular/platform-browser": "~2.4.1",
"@angular/platform-browser-dynamic": "~2.4.1",
"@angular/router": "~3.4.1",
"angular-cli": "^1.0.0-beta.24"

Когда я использовал 2.0.0, он не делает ошибку, но теперь он делает ошибку, например GET http://localhost:4200/null 404 (Not Found).

Несмотря на то, что он делает ошибку, он работает хорошо. Однако я хочу знать, почему это происходит, и исправить эту ошибку. Если кто-нибудь знает об этом, пожалуйста, дайте мне знать. Спасибо:)

Packages.json

{
  ...
  
  "private": true,
  "dependencies": {
    "@angular/common": "~2.4.1",
    "@angular/compiler": "~2.4.1",
    "@angular/compiler-cli": "^2.4.1",
    "@angular/core": "~2.4.1",
    "@angular/forms": "~2.4.1",
    "@angular/http": "~2.4.1",
    "@angular/material": "^2.0.0-beta.0",
    "@angular/platform-browser": "~2.4.1",
    "@angular/platform-browser-dynamic": "~2.4.1",
    "@angular/router": "~3.4.1",
    "@types/moment-timezone": "^0.2.33",
    "angular-cli": "^1.0.0-beta.24",
    "angular2-google-maps": "^0.17.0",
    "bootstrap": "^3.3.7",
    "bourbon": "^4.2.7",
    "core-js": "^2.4.1",
    "es6-promise": "^4.0.5",
    "font-awesome": "^4.7.0",
    "hammerjs": "^2.0.8",
    "moment": "^2.17.1",
    "moment-timezone": "^0.5.10",
    "node-sass": "^3.13.0",
    "primeng": "^1.1.0",
    "pubnub-angular2": "^1.0.0-beta.6",
    "quill": "^1.1.8",
    "rxjs": "5.0.1",
    "ts-helpers": "^1.1.1",
    "typescript": "^2.0.10",
    "typings": "^2.1.0",
    "zone.js": "^0.7.4"
  },
  "devDependencies": {
    "@types/hammerjs": "^2.0.33",
    "@types/jasmine": "^2.2.30",
    "@types/moment": "^2.13.0",
    "@types/moment-timezone": "^0.2.33",
    "@types/node": "^6.0.42",
    "angular-cli": "^1.0.0-beta.24",
    "bootstrap-sass": "^3.3.7",
    "codelyzer": "~0.0.26",
    "jasmine-core": "2.4.1",
    "jasmine-spec-reporter": "2.5.0",
    "karma": "1.2.0",
    "karma-chrome-launcher": "^2.0.0",
    "karma-cli": "^1.0.1",
    "karma-jasmine": "^1.0.2",
    "karma-remap-istanbul": "^0.2.1",
    "protractor": "4.0.9",
    "ts-loader": "^1.3.3",
    "ts-node": "1.2.1",
    "tslint": "4.2.0",
    "typescript": "2.0.2"
  }
}
4b9b3361

Ответ 1

Так что у меня было утомительное время, чтобы понять это, но я сделал.

Это случилось со мной сразу после обновления, но это не имело никакого отношения к этому.

Это определенно ссылка на переменную с нулевым значением и, скорее всего, атрибут src изображения. По крайней мере, это было для меня, и я использую значения с сервера повсюду в моем приложении, и img src были единственными причинами, и это имеет смысл.

У меня было что-то похожее на это:

<img [src]="myData?.imageUrl">

Я думал что то ? Безопасный оператор удостоверится, что я не получил нулевые ошибки, что обычно происходит, но, похоже, когда вы связываетесь с атрибутом src, браузер выдает ошибку, а не компилятор. Компилятор позволяет привязать к нему значение null из-за оператора safe, но поскольку src является ссылочным URL-адресом, браузер все еще ищет этот URL-адрес, и консоль выдает ошибку, поскольку не может найти relative/app/path/null URL-адрес relative/app/path/null

Два способа, которые я нашел, чтобы решить эту проблему:

  1. Используйте ngIf: <img *ngIf="myData" [src]="myData.imageUrl"/> (все изображение и его атрибут src никогда даже не загружаются, если нет данных, что полностью <img *ngIf="myData" [src]="myData.imageUrl"/> проблему)
  2. Используйте интерполяцию: <img src="{{ myData?.imageUrl }}"/> (ВНИМАНИЕ: в этом решении вам все еще нужен безопасный оператор, потому что компилятор выдаст ошибку иначе, как и ожидалось, но теперь, если значение равно нулю, затем src="" вместо нуля, который является допустимым HTML и не будет выдавать ошибку ссылки)

Надеюсь это поможет!

Ответ 2

В дополнение к запросу HauntedSmores: вы также можете использовать '' -fallback:

[src]="myObj.img || ''"

поскольку elvis-operator ? недоступен в .ts файлах, но только в шаблонах, вы также можете поместить его в typescript -getters.

Ответ 3

Происходит то, что некоторые браузеры (например, Chrome) выполняют некоторую функцию toString для атрибута src, что приводит к тому, что null становится 'null' вместо '', таким образом вызывая браузер для поиска //domain.com/null.

Некоторые могут вспомнить ng-src из AngularJS, который был создан для этого.


В любом случае, после множества вариантов я нашел следующие решения:

<img [attr.src]="myImageUrl"/>

Это работает и для async (который в основном вызывал эту проблему для меня):

<img [attr.src]="myImageUrl | async"/>

Это работает, потому что вместо установки src в 'null' или '', атрибут src не устанавливается вообще, пока используемая переменная/путь не установлена /не разрешена, поэтому не вызывает ошибку.

Ответ 4

В моем случае ошибка произошла из-за использования несуществующего свойства из моего шаблона (немой меня). Мой код был таким:

<img [src]='imageUrl'/>

Но базовый класс для шаблона имел свойство с именем:

imageURL: string;

Итак, я изменил imageUrl на imageUrl и работал как шарм!

Ответ 5

ИЛИ Когда их значение равно нулю/нет в нашем объекте, мы можем вместо этого дать статическое изображение

HTML

<img src={{row.webimage?row.webimage:localpath}}/>

Typescrpit

localpath = '../assets/img/default-user.png'

Точно так же мы можем использовать привязку для атрибута src.

Ответ 6

С троичным оператором:

[ngStyle]="{'background-image': myVariable? 'url(' + myVariable.image + ')' : 'none'}"