清水さん
しもだと申します。
先に結論を申し上げますと
hifive ver.1.2で追加した”res”(リソース)モジュールをご利用いただくと
よいかと思います。
<サンプルコード>
============
(function(){
//他のファイルを検索するときのルートURLを(コンテキストルートを含め絶対パスで)指定する。
//この設定は、実際には別の(各JSPで共通に読み込まれる)JSファイルに記述しておく。
//環境によってコンテキストルートなどが変わる場合、
//このbaseUrlを一か所のみ書き換えればよい。
//(あるいは、環境毎に(異なるbaseUrlがかかれた)JSファイルを用意しておき
// JSP等で実際にクライアントが読み込むJSファイルを切り替える、等の方法でもよい。)
h5.settings.res.baseUrl='/ctxRoot/src';
var sampleController = {
__name: 'sample.SampleController',
// h5.res.dependsOn()でEJSファイルを指定する。
// 複数のEJSファイルを読み込む場合は配列で指定する
// (1つであれば配列にせず dependsOn(‘tmpl.ejs’) のように書ける)
// 下記の場合、baseUrlと合わせて “/ctxRoot/src/template/sample1.ejs” というURLで
// EJSファイルを取得しに行く
__templates: h5.res.dependsOn(['template/sample1.ejs', 'template/sample2.ejs']),
__ready: function(){
this.view.append('.textArea', 'sampleTmpl1');
this.view.append('.textArea', 'sampleTmpl2');
}
}
h5.core.controller('.sample', sampleController);
})();
============
詳細はこちらをご参照ください。
https://www.htmlhifive.com/conts/web/view/reference/resource-spec#Hejs30D530A130A430EB306E89E36C7A
なお、h5.res.dependsOn()と何度も書くのが面倒な場合は、
var dependsOn = h5.res.dependsOn;
と先頭に書いておくと
(function() {
var dependsOn = h5.res.dependsOn;
var sampleController = {
__name: 'sample.SampleController',
//ここでは単に dependsOn()と書ける
__templates: dependsOn(['template/sample1.ejs', 'template/sample2.ejs']),
};
)();
ので、何度も書く場合には少し記述が楽できるかと思います。
<参考>
EJSテンプレートのパスについて、
テンプレートのパスをコントローラに
var myController = {
__name: ‘sample.MyController’,
__templates: ‘template/tmpl.ejs’
};
のように直接文字列で(かつ相対パスで)記述した場合、
EJSファイルのパスは表示しているページ(HTML)のパスが基準となります。
ver.1.1までだと
var TEMPLATE_BASE_URL = ‘/context-root/src/’; //別の共通JSファイルで定義
var controller = {
__templates: TEMPLATE_BASE_URL + ‘templates/tmpl.ejs’
};
のようにする方法がありましたが、
(ご指摘の通りパスが完全にJSファイルに埋め込まれてしまうので使いづらいという声もあり)
EJS以外のファイルを含め動的にロードする方法を統一するため、
ver.1.2でリソース管理機能を追加しました。
返信が遅くなり失礼しました。
また不明点、困ったことなどあればお気軽にお問い合わせください。
よろしくお願いします。
--
このメールは Google グループのグループ「hifive User Group」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには hifive-users...@googlegroups.com
にメールを送信してください。
このグループに投稿するには hifive...@googlegroups.com
にメールを送信してください。
https://groups.google.com/group/hifive-users
からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout
にアクセスしてください。
清水さん
しもだです。
前提として、「コンテキストルート」はJavaEEにおける概念のため、
純粋なブラウザのURLだけからでは
パスのどこ(どこまで)がコンテキストルートかどうかはわかりません。
従って、パスを相対化しつつその起点を/、あるいは表示しているページのパスなど
一意に特定出来る場所以外に動的に指定する場合、
どこが起点か(=baseUrl)はなんらか指定する必要があります。
>動的には取得できない
画面(HTML)を例えばJSPで組み立てている場合
<%= request.getContextPath() %> でコンテキストルートを取得できます。
以下のようなスクリプトコードを、h5.jsを読み込むスクリプトタグの前に
JSP内に書いておくと、
クライアントに返されるHTMLでは3行目が
「h5.settings.res.beseUrl = '/context-root/src';」
のようになり、動的に設定できます。
-------------
●sample.jsp
<%-- contextPath変数にコンテキストルートを入れておく --%>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
…
<script>
//h5.jsが読み込まれる時にh5preinitイベントが起きるので、
//その際にsettingsにbaseUrlをセットする
$(document).bind('h5preinit', function() {
h5.settings.res.beseUrl = '${contextPath}/src'; //JSPが実行されると${contextPath}の部分が実際のコンテキストルートに置換される
};
});
</script>
<script src=”lib/hifive/h5.js”></script>
-------------
上の例ではHTML内に埋め込む場合で説明しましたが、
特定の(共通で読み込まれる)JSファイルに対して同様のことを行うことも可能だと思います。
>モジュールによってURLの階層(コンテキストルート以下)が異なることがあれば
意図を汲めていないようでしたらご指摘いただければと思いますが、
baseUrl以下のパス階層は任意ですので、それぞれ適当なパスを指定できます。
/context-root/common/sub/tmpl.ejs
module2/screen2.ejs
の場合:
h5.settings.res.baseUrl = ‘/context-root’; //前述の方法で動的に設定
としておき
module1Controller = {
__templates: h5.res.dependsOn(‘common/sub/tmpl.ejs’);
};
module2Controller = {
__templates: h5.res.dependsOn(‘module2/screen2.ejs’);
};
のように記述可能です
清水さん
しもだです。
>h5.settings.res.beseUrl = '<%= request.getContextPath() %>/';
h5.settings.res.baseUrl
でした。(b”e”se -> b”a”se)
# 私の書いたコードがtypoしていました。すみません。
b”a”seUrl にすれば、大丈夫かと思います。