2013-01-08 8 views
6

नीचे मेरे कोड का एक स्निपेट है। त्रुटि मैं हो रही है, कि जब मैं खोज की जाएगी तथा विधि _searchData कहते हैं, इसे सफलतापूर्वक विधि _lookUpSuccess कॉल है, लेकिन उसके बाद निम्न त्रुटि देता है:अपरिभाषित या शून्य संदर्भ की संपत्ति प्राप्त करने में असमर्थ - विंडोज 8 जेएस/सीएसएस ऐप

जावास्क्रिप्ट रनटाइम त्रुटि: संपत्ति प्राप्त करने में असमर्थ '_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); }; 

})(); 

उत्तर

8

कोड की इस पंक्ति में है , लेकिन जब इसे कहा जाता है, this का मान अब आप जो चाहते हैं वह नहीं है क्योंकि यह किए गए हैंडलर को जो भी कॉल करता है, उसके आंतरिक द्वारा निर्धारित किया जाएगा। फ़ंक्शन के रूप में this._lookUpSuccess पास करने से फ़ंक्शन पास हो जाता है। यह this के मान को पास नहीं करता है। इसलिए, जब this._lookUpSuccess को गलत this के साथ बुलाया जाता है, तो इसके अंदर this के किसी भी संदर्भ को उस पर अपेक्षित गुण नहीं मिलेगा (इस प्रकार आप जो त्रुटि देखते हैं)।

आप जब _lookUpSuccess() बुला जो एक स्थानीय चर में this मूल्य की बचत होती है इस तरह इसे ठीक कर और फिर इसका इस्तेमाल कर सकते हैं:

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

यह कॉलबैक में उचित this मूल्य reattaching के लिए काम के आसपास एक बहुत ही आम है ।

+0

बहुत बहुत धन्यवाद, इसने काम किया है, हालांकि उसने 'lookUpSuccess' विधि में एक नई समस्या पेश की है। अब मुझे 'संपत्ति प्राप्त करने में असमर्थ' प्रतिक्रिया 'अपरिभाषित या शून्य संदर्भ' का टेक्स्ट 'जैसे' उस संशोधन को रोक दिया गया है, '_lookUpSuccess' – James

+0

@James - हाँ, आपको परिणाम मान के साथ पास करना होगा। मैंने यह दिखाने के लिए अपना जवाब संशोधित कर दिया है कि आप यह कैसे करते हैं। नोट: यदि आपके पास 'this' ptr की आवश्यकता है, तो आपके पास' _lookUpFail' और '_lookUpProgress' के साथ एक ही समस्या है। – jfriend00

+0

यह पूरी तरह से काम किया, इस मदद के लिए बहुत बहुत धन्यवाद। जानने के लिए समस्या निवारण का एक बहुत ही उपयोगी बिट! – James

2

में:

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

आप किया हैंडलर समारोह के रूप में _lookupSuccess गुजर रहे हैं:

this._displayResult(content); 

वहाँ, this जाहिरा तौर पर undefined या null

+0

मैंने इसे मूल रूप से सोचा लेकिन फिर निम्नलिखित लिंक को देखा जो सुझाव दिया गया कि इसे 'अपरिभाषित' होना चाहिए - http://stackoverflow.com/questions/9822561/why-is-this-in-an-anonymous-function-undefined- जब-उपयोग-सख्त – James

संबंधित मुद्दे