[mayaa-user:792] Re: mayaaプロセッサが当てられているタグ名を知りたい

かとちん@mayaa-ml [E-MAIL ADDRESS DELETED]
2009年 5月 29日 (金) 12:57:24 JST


加藤です。

マニアックな使い方ではありますが、
スクリプトから「originalNode.QName.localName」で、タグ名が参照できます。
ただし、その時点で参照可能な直近の対象ノードであることに注意する必要があります。
beforeRender内などでは正しい結果が得られません。

また、「originalNode」だけ書いてしまうと、現行の1.1以降の全てのバージョンで、
最適化機能が有効な場合(デフォルト設定)に、無限ループするという不具合が見つかっております。
この問題に対しては先ほど対策し、SVNのリビジョン(3440以降)で修正済みです。
「originalNode」だけ書くということをしない限りは、現行リリースバージョンでも
問題ないと思います。

この originalNode は何者か?という点ですが、
mayaaのソースに含まれる、org.seasar.mayaa.cycle.ServiceCycle インターフェースの
getOriginalNode() メソッドに当たります。
ServiceCycleインスタンスはページスコープ上に浮いています。
幾つかのメソッドは、プロセッサがネストするごとに異なる内容を返します。

mayaaのドキュメントに記述している、グローバル関数の幾つかもServiceCycleインスタンスの
メソッドで提供されています。

rhinoは、Javaオブジェクトのアクセッサをフィールドのように参照するので、
originalNodeは、(ServiceCycleのインスタンス).getOriginalNode() が呼ばれます。

「getOriginalNode().getQName().getLocalName()」でもタグ名の参照が可能です。
ただ、長くなるだけですので冒頭にあげた記述の方が良いでしょう。


おまけとして、対象HTMLタグの属性を取得する方法も以下に示します。
--------
<m:beforeRender>
    <![CDATA[
        var QNameImpl =
            Packages.org.seasar.mayaa.impl.engine.specification.QNameImpl;

        function getHtmlAttribute(htmlNode, name) {
            var attr = htmlNode.getAttribute(
                 QNameImpl.getInstance(htmlNode.QName.namespaceURI, name));
             if (attr != null) {
                 return attr.value;
             }
             return undefined;
        }
    ]]>
</m:beforeRender>

<m:write id="write"
    value="${
        originalNode.QName.localName
        + ' class='
        + getHtmlAttribute(originalNode, 'class') }"/>
--------



> お世話になっておりますsusukiです。
> 
>> これだと代替手段はありませんね。
> 了解しました。
> 
>> ただ、タグの種類が異なるのであれば、プロセッサは別にする方が
>> 自然だと思います。
> テンプレートHTMLは開発者ではない人が作ることを想定しています。
> テキストボックスとテキストエリアに初期表示をするのは
> 画面表示的には同じように見えるので
> 同じidでできた方が親切かなと思い、mayaaプロセッサで違いを
> 吸収してあげたかったというのが目的でした。
> でもプロセッサは分けていきたいと思います。
> テンプレート作成者に少し注意して頂ければ済みますし。
> 
>> HTML の id は、複数のタグで同じ値を持つことを許していませんので、
>> m:id を使うようにした方が良いかもしれません。
>>
>> バリデーションにひっかかる、JavaScript から id 指定で呼べない、
>> くらいの問題があります。
> ありがとうございます。
> 検討してみます。
> 
> 
> 迅速で丁寧な対応で助かりました!
> また何かありましたらよろしくお願いします!
> 
> 以上です。
> 
>> suga です。
>>
>> 2009/5/26 [E-MAIL ADDRESS DELETED] <[E-MAIL ADDRESS DELETED]>:
>>>> どういった場合にタグ名を取得したいのでしょうか。
>>>> 場合によっては代替手段があるかもしれません。
>>> inputタグでもTEXTAREAタグでも、同じid設定で
>>> 初期表示を行いたいのです。
>>>
>>> inputタグとTEXTAREAタグでは初期表示させる場合
>>> Mayaaプロセッサの書き方が変わりますので
>>> プロセッサ内でタグ名を取得して分岐する必要が
>>> あると考えました。
>>> ドキュメントにはそれらしい使い方が
>>> 載っていなかったので質問させて頂いた次第です。
>> これだと代替手段はありませんね。
>>
>> ただ、タグの種類が異なるのであれば、プロセッサは別にする方が
>> 自然だと思います。
>> (もうちょっと広い範囲が分かると意見が変わるかもしれませんが)
>> 値を取得するのに記述が多いような場合は、beforeRender でまとめて
>> おくか、Java でユーティリティを作るかすると良いでしょう。
>>
>>
>> 余談ですが、
>>
>>> ***********HTMLコード***********
>>> <input type="text" id="setDefaultValue" />
>>>
>>> <TEXTAREA id="setDefaultValue"></TEXTAREA>
>> HTML の id は、複数のタグで同じ値を持つことを許していませんので、
>> m:id を使うようにした方が良いかもしれません。
>>
>> バリデーションにひっかかる、JavaScript から id 指定で呼べない、
>> くらいの問題があります。
>>
> _______________________________________________
> mayaa-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/mayaa-user
> 



mayaa-user メーリングリストの案内