2

この質問がすでにどこかで尋ねられている場合はまず申し訳ありませんが、グーグルで数時間経ってもまだ答えが見つかりません.

私はポートレット開発にかなり慣れていません (ただし、開発者が不足しており、時々それを使用する必要があります)、解決策は些細なことかもしれませんが、実際には十分な経験がありません。

問題は、1 つのページに 2 つのポートレットがあり、そのうちの 1 つに他のポートレットの変更を知らせようとすることです。これには IPC を使用します。最初のものには Liferay.fire 関数があります:

function fire(key,value){
    Liferay.fire(
        'category',{
            id: key,
            name: value
         }
    );
}

もう1つは、Liferay.on('category',function(category){...})内部にajax呼び出しといくつかのレンダリングメソッドを含む関数があります。

上記のページにアクセスして対応するボタンをクリックすると、最初はすべて正常に機能します。ただし、このページから移動して戻ると、リスナーが 2 回実行されます。再度ナビゲート -> 3 回。など...しかし、ページをリロードすると(F5またはCTRL + F5で)、最初からやり直すため、さらにナビゲーションするまで、リスナーは1回だけ実行されます。

もう 1 つの奇妙な点は、関数が何回実行されても、入力パラメーターはすべて同じです。

たとえば、ページを離れて 3 回戻ってきて、最後に「id=1」のカテゴリを選択した場合、関数は「id=1」で 3 回実行されます。「id=2」を選択すると、「id=2」で 3 回実行されます。

ほぼ1日立ち往生しているので、誰かが何か考えを持っているなら、本当に感謝しています.

事前にどうもありがとうございました。さらに情報が必要な場合はお知らせください。

4

1 に答える 1

3

あなたが抱えている問題はLiferay.on、作成されているが削除されていないグローバルリスナーが原因です。

Liferay Portal 7.x では、SPA ナビゲーションがデフォルトで有効になっています。これは、ナビゲートしているときに、ページが完全に更新されるのではなく、サーバーからの新しいデータで更新されるだけであることを意味します。

従来のナビゲーション シナリオでは、ページを更新するたびにすべてがリセットされるため、取り残されたすべてのものに注意を払う必要はありません。ただし、SPA シナリオでは、またはボディ デリゲートなどのグローバル リスナーLiferay.onLiferay.after問題になる可能性があります。そのコードを実行するたびに、グローバルに永続化されたLiferayオブジェクトにさらに別のリスナーを追加しています。その結果、これらのリスナーの複数の呼び出しが観察されます。

これを修正するには、次のようにリスナーをデタッチするためにナビゲーション イベントをリッスンする必要があります。

var onCategory = function(event) {...};

var clearPortletHandlers = function(event) {
    if (event.portletId === '<%= portletDisplay.getRootPortletId() %>') {
        Liferay.detach('onCategoryHandler', onCategory);
        Liferay.detach('destroyPortlet', clearPortletHandlers);
    }
};


Liferay.on('category', onCategory);
Liferay.on('destroyPortlet', clearPortletHandlers);
于 2016-11-09T12:46:28.103 に答える