6

以下は私のコードの抜粋です。私が得ているエラーは、検索を実行してメソッドを呼び出すと、メソッド_searchDataを正常に呼び出し_lookUpSuccessますが、次のエラーを返すことです。

JavaScriptランタイムエラー:未定義またはnull参照のプロパティ'_displayResult'を取得できません

_displayResultメソッドを呼び出そうとしたとき。

なぜそうなのか?

(function () {

    // make this an object property/method eventually
    var displayResult = function (queryResult) {
        for (var i = 0; i < holder.length; i++) {
            //document.querySelector(".item-content .title").textContent = "FilmApp";
            document.querySelector(holder[i]).textContent = queryResult[i];
       }};

    // Creates a new page control with members
    ui.Pages.define(searchPageURI, {
       //...
        _searchData: function (queryText) {
            searchBase          = 'http://www.example.com/web-service2.php?termID=';
            searchFormat        = 'JSON';
            searchFormatPiece   = '&format=' + searchFormat;

            if (!window.Data) {  
                var searchUrl = searchBase + queryText + searchFormatPiece;
                WinJS.xhr({ url: searchUrl }).done(this._lookUpSuccess, this._lookUpFail, this._lookUpProgress);
            }else{
                document.querySelector(".titlearea .pagetitle").textContent = "There has been a computer malfunction - sort it the **** out!";
            }
        },

        _lookUpSuccess: function xhrSucceed(Result) {
            var response = JSON.parse(Result.responseText);
                if (response.response[0].Message === "Found") {
                    for (var x in response.response[1].term) {
                        content.push(response.response[1].term[x]);
                    };
                    this._displayResult(content);
                    //displayResult(content);
                    return content;
                } else {
                    content.push("Not Found", "Not Found");
                    return content;
                }
         },

        _lookUpFail: function xhrFail(Result) { document.querySelector(".titlearea .pagetitle").textContent = "Got Error"; },
        _lookUpProgress: function xhrProgress(Result) { document.querySelector(".titlearea .pagetitle").textContent = "No Result 2"; },

        _displayResult: function (queryResult) {
            var holder;
            holder = [DefDiv, DescDiv];

            for (var i = 0; i < holder.length; i++) {
                //document.querySelector(".item-content .title").textContent = "FilmApp";
                document.querySelector(holder[i]).textContent = queryResult[i];
            };
        },

    });

    // End of UI.page.define    

    // #2 This method is run on application load
    WinJS.Application.addEventListener("activated", function (args) {
        if (args.detail.kind === appModel.Activation.ActivationKind.search) {
            args.setPromise(ui.processAll().then(function () {
                if (!nav.location) {
                    nav.history.current = { location: Application.navigator.home, initialState: {} };
                }
            return nav.navigate(searchPageURI, { queryText: args.detail.queryText });
            }));
        }
    });

    // #3 
    appModel.Search.SearchPane.getForCurrentView().onquerysubmitted = function (args) { nav.navigate(searchPageURI, args); };

})();
4

2 に答える 2

8

このコード行では:

WinJS.xhr({ url: searchUrl }).done(this._lookUpSuccess, this._lookUpFail, this._lookUpProgress);

あなたはdoneハンドラー関数として渡しています_lookupSuccessが、それが呼び出されるとthis、doneハンドラーを呼び出すものの内部によって設定されるため、の値は希望どおりではなくなります。関数として渡すthis._lookUpSuccessと、関数が渡されます。の値を渡しませんthis。したがって、this._lookUpSuccessが間違って呼び出された場合this、その内部への参照thisは、期待されるプロパティを見つけることができません(したがって、エラーが表示されます)。

このように修正すると、this値がローカル変数に保存され、次を呼び出すときに使用できます_lookUpSuccess()

var self = this;
WinJS.xhr({ url: searchUrl }).done(function(result) {self._lookUpSuccess(result)}, this._lookUpFail, this._lookUpProgress);

thisこれは、コールバックで適切な値を再アタッチするための非常に一般的な回避策です。

于 2013-01-08T08:19:11.870 に答える
2

の:

this._displayResult(content);

そこに、thisどうやらundefinedまたはnull

于 2013-01-08T08:16:57.370 に答える