2012-10-30 14 views
10

मैं एक त्रुटि पकड़ना, इसे सही करना और प्रोग्राम निष्पादित करना जारी रखना चाहता हूं। http://jsfiddle.net/Gthv9/12/KnockoutJS पकड़ त्रुटियों बाध्यकारी

लेकिन, मैं यह नहीं कर सकता!

यदि आप इस पर क्लिक करते हैं: "मॉडल पर फिर से जांचें", "मॉडल 3 पर पुनः जांचें" - यह ठीक है।

यदि आप इस पर क्लिक करते हैं: "मॉडल पर फिर से जांचें", "मॉडल 2 पर पुनः जांचें", "मॉडल 3 पर फिर से जांचें" - एक त्रुटि है।

Uncaught Error: Unable to parse bindings. 
Message: ReferenceError: name3 is not defined; 
Bindings value: text: name3 

क्यों?

मैंने समस्या कोड को एक कोशिश-पकड़ ब्लॉक (viewModel.recheckData2()), में लपेट लिया है, लेकिन एप्लिकेशन viewModel.recheckData3() पर क्लिक करने पर क्रैश हो जाता है!

मुझे पता है कि knockoutJS त्रुटि स्थिति (नया मॉडल 2()) संग्रहीत करता है, लेकिन मुझे नहीं पता कि मुझे क्या करना चाहिए।

मैं त्रुटि को सही तरीके से कैसे पकड़ सकता हूं?

धन्यवाद!

उत्तर

35

मुझे यकीन नहीं है कि मैं आपका सटीक लक्ष्य समझता हूं, लेकिन इस प्रकार के किसी भी प्रकार में चलने पर नॉकआउट बाध्यकारी बंद हो जाएगा।

यदि आपकी समस्या बस अपरिभाषित चर है, तो एक चाल जिसे आप उपयोग कर सकते हैं name3 के बजाय $data.name3 के खिलाफ बाध्य करना है। किसी वैध ऑब्जेक्ट की अपरिभाषित संपत्ति को एक्सेस करने से कोई त्रुटि नहीं होती है।

यदि आप वास्तव में कुछ और मजबूत चाहते हैं, तो आप custom binding provider का उपयोग करने पर विचार कर सकते हैं।

उदाहरण के लिए, आप एक त्वरित आवरण वास्तविक बाध्यकारी प्रदाता के लिए लिख सकते हैं:

var ErrorHandlingBindingProvider = function() { 
    var original = new ko.bindingProvider(); 

    //determine if an element has any bindings 
    this.nodeHasBindings = original.nodeHasBindings; 

    //return the bindings given a node and the bindingContext 
    this.getBindings = function(node, bindingContext) { 
     var result; 
     try { 
      result = original.getBindings(node, bindingContext); 
     } 
     catch (e) { 
      if (console && console.log) { 
       console.log("Error in binding: " + e.message); 
      } 
     } 

     return result; 
    }; 
}; 

ko.bindingProvider.instance = new ErrorHandlingBindingProvider(); 

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

नमूना: http://jsfiddle.net/rniemeyer/KxXqs/

अद्यतन: यहाँ है कि बाध्यकारी वाक्य रचना के साथ-साथ त्रुटियों में जाल/लॉग त्रुटियों जब सीमित मान वास्तव में मूल्यांकन किया जाता है 3.0+ के लिए एक संस्करण है। http://jsfiddle.net/rniemeyer/ecbn1dmy/

+4

आप गुरु नॉकआउट ! :) – zoh

+0

@ आरपी निमेयर "वैध ऑब्जेक्ट की एक अपरिभाषित संपत्ति को एक्सेस करने से कोई त्रुटि नहीं होती है" - मैंने टेम्पलेट बाइंडिंग की नाम संपत्ति पर एक फ़ंक्शन असाइन किया है। यदि फ़ंक्शन अपरिभाषित हो जाता है, तो मुझे इस तरह की अनचाहे त्रुटि मिलती है कि प्रश्नकर्ता इस बारे में बात कर रहा है कि मैं $ रूट या $ डेटा या केवल फ़ंक्शन नाम का उपयोग करता हूं या नहीं। उस मामले में 'गणना' सहायता का उपयोग करेंगे? – DavidHyogo

+0

@DavidHyogo - क्या आपके पास jsFiddle या कुछ नमूना कोड है? लगता है जैसे कुछ और चल रहा है। –

1

मैं कैच ब्लॉक में त्रुटि पैदा नोड सांत्वना देने @RPNiemeyer से त्रुटि हैंडलर के लिए एक और लाइन जोड़ा - यह वास्तव में आसान एक जटिल पृष्ठ पर त्रुटि खोजने के लिए बनाता है:

if (console && console.log) { 
      console.log("Error in binding: " + e.message); 
      console.log("Node causing error:"); 
      console.log(node); 
     } 
संबंधित मुद्दे