Oprava
Děkujeme @neojp za jeho odpověď https://twitter.com/neojp/status/1269708074387939329
Napsal jsem tento blogový příspěvek, aniž bych plně pochopil důvody pro přepisování adres URL, otisky prstů a TIL <base />
jednoduchým a přímočarým řešením pro práci s adresami URL v obou prostředích je přidání <base href={{rootURL}} />
v /app/index.html. Začal jsem používat ember kolem 2.8 a právě jsem zjistil, jaký byl skutečný účel baseURL
v config/environment.js
a dobře, v ember-cli 2.7 byla zastaralá, to prakticky mění způsob, jakým adresy URL aktiv v ember fungují. Překvapivě doporučeným řešením je použití
Například
{{! Old: (with baseURL and/or <base /> tag) }}
<img src="assets/images/logo.png" />
{{! New: }}
<img src="/assets/images/logo.png" />
Pokud chcete přidat základní značku, kterou doporučuji:
<!-- index.html -->
...
<head>
<base href="{{rootURL}}" />
</head>
To znamená, že všechny ne zcela kvalifikované adresy URL získají kořenovou adresu URL vašeho souboru config/environment.js s předponou prohlížečem.
Myslím, že to ve skutečnosti není tak dobře zdokumentováno v průvodcích Ember.js nebo v tutoriálu Ember.js. Nové aplikace ember se spouští bez <base />
tag, nebude tedy bezproblémově fungovat v prohlížeči a v corberu, protože při běhu v cordově nemůžete jednoduše ukazovat relativní cesty, tj. /asset/img/photo.jpg
, veškerý majetek je umístěn jinde. Stříbrná kulka je <base />
tag.
Pomocník navržený v tomto příspěvku na blogu je užitečný, pokud chcete přidat <base />
jiným způsobem tag ve vašem index.html kvůli nějakému neočekávanému chování kolem něj nebo jen následovat(?) aktuální plán ember-cli... následující pomocník vám dá správnou relativní cestu v šablonách a JS bez ohledu na to, zda běžíte v cordově nebo prohlížeče, musíte se jen ujistit, že tento pomocník běží po cordova.deviceReady
// helpers/public-url
import Helper from '@ember/component/helper';
import config from 'ember-get-config';
let IS_READY = false;
export function publicUrl(url) {
if (typeof FastBoot === 'undefined' && window.cordova && IS_READY) {
return `${window.cordova.file.applicationDirectory}www/${config.ENV.rootURL}${url}`;
}
return `${config.ENV.rootURL}${url}`;
}
export default Helper.extend({
cordovaEvents: service('ember-cordova/events'),
deviceReadyObserver: subscribe('cordovaEvents.deviceready',
function(){
IS_READY = true;
recompute();
})
compute([url]){
return publicUrl(url);
}
});
A použijte to v šablonách, jako je tato
<img src={{public-url "assets/images/teams/{{team.short_name}}.png"}} alt="{{team.name}}'s flag" style="width: 50px;">
A v js takhle
import { publicUrl } from '../helpers/public-url';
publicUrl(`assets/images/teams/${team.short_name}.png`);