0

すべてのページのメイン要素として ListViews を持つ Windows Metro アプリを作成しています。ページ間の移動、特に移動が速すぎるという問題に遭遇しました。あるページの ListView アイテムをクリックして別のページに移動し、新しいページをクリックして戻します。これを速すぎると、次のようになります。

Exception was thrown but not handled in user code at line 20, column 13 in ms-appx://01c489fc-0e20-415d-ad4b-2895b4bc6e90/pages/groupedItems/groupedItems.js

0x800a138f - JavaScript runtime error: Unable to get property 'cloneNode' of undefined or null reference

If there is a handler for this exception, the program may be safely continued.

これは何を意味するのでしょうか?そして、この例外を寄せ付けず、迅速なナビゲーションを可能にするテクニックはありますか?

エラーが発生するコードは次のとおりです。

function multisizeItemTemplateRenderer(itemPromise)
{
    return itemPromise.then(function (currentItem)
    {
        var content;

    // Grab the default item template used on the groupeditems page.
    content = document.getElementById('multiTemplate');

    /*************************
     This line is where it fails:
     *************************/
    var result = content.cloneNode(true);

    // Change the CSS class of the item depending on the group, then set the size in CSS.
    switch (currentItem.groupKey)
    {
        case "1":
            {
                // Decides which item to resize based on items index
                if (currentItem.index == 0 || currentItem.index == 1)
                {
                    result.className = "largeitemtemplate"
                }

                else
                {
                    result.className = "mediumitemtemplate"
                }
                break;
            }

        default:
            {
                result.className = "smallitemtemplate"
            }
    }
    // Because we used a WinJS template, we need to strip off some attributes 
    // for it to render.
    result.attributes.removeNamedItem("data-win-control");
    result.attributes.removeNamedItem("style");
    result.style.overflow = "hidden";

    /************************
     If this try catch isn't here, a RuntimeException occurs during quick navigation.
     ************************/
    try{
        result.getElementsByClassName("item-image")[0].src = currentItem.data.backgroundImage;
        result.getElementsByClassName("item-title")[0].textContent = currentItem.data.title;
    } catch (exception) {
        console.log(exception.name +  ": " + exception.message);
    }
    return result;
});
}
4

2 に答える 2

0

おそらく、この MSDN チュートリアルが役立ちます。

// Because we used a WinJS template, we need to strip off some attributes 
// for it to render.
result.attributes.removeNamedItem("data-win-control");
result.attributes.removeNamedItem("style");
result.style.overflow = "hidden";

// Because we're doing the rendering, we need to put the data into the item.
// We can't use databinding.
return result;
于 2013-05-06T02:18:09.243 に答える
0

ListView にはたくさんの要素があると思います。そして、ページ全体が完全にレンダリングされるのを待たないでください。このビューで何かをクリックする前に、もう少し待ってみてください。バグは消えます:)クリックすると、新しいレンダリングプロセスが開始され、オブジェクト「ドキュメント」が新しいものに変更されます。現在のレンダラーは、別の構造を持ち、id='multiTemplate' の要素を含まないこの新しいドキュメントにアクセスします。したがって、document.getElementById('multiTemplate') は null を返します。

于 2012-07-25T13:44:39.070 に答える