2012-03-03 17 views
36

मैं अनुबंध लाइन आइटम (सीआईएल) की एक सरणी बनाने का प्रयास कर रहा हूं जिसे सामान्य अनुबंध जानकारी के शीर्षलेख के नीचे व्यक्तिगत div तत्वों के रूप में प्रदर्शित किया जाएगा।एक अवलोकन योग्य ऐरे की लंबाई कैसे प्राप्त करें?

मैं सामान्य अवलोकन करने योग्य काम करने में सक्षम हूं, लेकिन ऐसा लगता है कि दृश्य मॉडल के लिए कन्स्ट्रक्टर के माध्यम से सरणी के गुजरने से क्लिन्स अवलोकन योग्य सरणी का कोई भी हिस्सा नहीं बन रहा है।

मेरे पास jsFiddle that illustrates my problem है। मेरे लिए अजीब बात यह है कि HTML स्पैन टैग पर data-bind="text: clins.length() शून्य भी नहीं लौटाता है, बल्कि इसके बजाय कुछ भी प्रस्तुत नहीं करता है।

क्या किसी भी तरह jsFiddle में डिबगिंग सक्षम करने के लिए है या मुझे चेतावनी/त्रुटि दिखाई देनी चाहिए?

उत्तर

67

jsfiddle पृष्ठों से त्रुटियां आपके ब्राउज़र पर भेजी जाती हैं।

अपने त्रुटि का सवाल है, इस प्रयास करें:

<span data-bind="text: clins().length"> 

यह एक array में observableArray बदल जाता है और सरणी के length संपत्ति का उपयोग करता है।

updated the jsfiddle as well देखें।

ko.observableArray.fn.totalVisible = function() { 
    var items = this(), count = 0; 

    if (items == null || typeof items.length === "undefined") { 
     return 0; 
    } 

    for (var i = 0, l = items.length; i < l; i++) { 
     if (items[i]._destroy !== true) { 
      count++; 
     } 
    } 

    return count; 
}; 

तो यह उपयोग करने के लिए:

+0

वाह, मुझे विश्वास नहीं है कि मैंने इसे नहीं देखा है। सहायता के लिए धन्यवाद। –

+1

इसे चेक आउट करें: http://jsfiddle.net/TuRrs/5/, यदि आप रुचि रखते हैं तो एक कस्टम बाइंडिंग 'मुद्रा टेक्स्ट' जोड़ा। – kendaleiv

+0

बहुत बहुत धन्यवाद, मैं इसे देख लूंगा। –

5

जो कोई _destroy एड आइटम के बिना एक observableArray की लंबाई प्राप्त करना चाहता है के लिए, आप इस सुविधा का उपयोग कर सकते हैं

myObservableArray.totalVisible(); 
+0

बढ़िया, मैं इस एक दूर बाद में के लिए फ़ाइल होगा। उपयोग। धन्यवाद। :-) –

16

टी एल; डीआर/त्वरित फिक्स

अंतर्निहित सरणी प्राप्त करने के लिए observableArray निष्पादन के रूप में निष्पादित करें, तब इसकी लंबाई प्राप्त करें:

<!--              ↓↓        --> 
myObsArray's length is: <span data-bind="text: myObsArray().length"></span> 

क्यों होता है?

मुझे एक जवाब है कि @kendaleiv's solution के अलावा कुछ विवरण प्रदान करता है प्रदान करते हैं, और यह कि यह भी एक अत्यधिक संबंधित सवाल मैं कितने लोगों ने महसूस जवाब देता है:

क्यों करता myObsArray.lengthहमेशा वापसी 0 (शून्य)?

ऐसे परिदृश्य का एक विशिष्ट रेप्रो इस होगा:

ko.applyBindings({ myObsArray: ko.observableArray(["one", "two", "three"]) });
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 
myObsArray.length = <span data-bind="text: myObsArray.length"></span>

टुकड़ा कहते हैं, "लंबाई = 0", बजाय "लंबाई = 3" की।

यहां ध्यान देने योग्य महत्वपूर्ण बात: ko.observableArray एक फ़ंक्शन है ...जो एक फ़ंक्शन देता है।

यह सही है: यदि आप एक चर या सदस्य को इसके बारे में परिणाम असाइन करते हैं, उदाहरण में myObsArray जैसे कि चर एक समारोह के लिए एक संदर्भ हो जाएगा। तो अगर आप के लिए

myObsArray.length 

पूछ रहे हैं तो आप वास्तव में the Function.length property के लिए पूछ रहे हैं: तर्क समारोह लेता है कि की संख्या। ko.observableArray से लौटाए गए फ़ंक्शन के लिए यह 0 (शून्य) होगा।

कैसे क्या हम इसे ठीक करते हैं?

अन्य उत्तरों में दिए गए फिक्स ठीक है, मुझे यहां इस उत्तर के उदाहरण के साथ दोहराएं। की "सरणी पालन किया जा रहा" लंबाई पाने के लिए आपको की जरूरत आह्वान समारोह कहा सरणी प्राप्त करने के लिए, और तो इसकी लंबाई मिलती है:

ko.applyBindings({ myObsArray: ko.observableArray(["one", "two", "three"]) });
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 
myObsArray.length = <span data-bind="text: myObsArray().length"></span>


अंत में , एक फुटनोट के रूप में, ओपी का कोड कुछ बराबर है:

myObsArray.length() 

यह उपरोक्त फ़ंक्शन। लम्बाई गुण पाएगा और इसे फ़ंक्शन के रूप में निष्पादित करने का प्रयास करेगा (जो यह नहीं है), और 0 वापस नहीं लौटाएगा बल्कि बदले में क्रैश होगा। एक समारोह के रूप में length का आह्वान न करने के लिए सावधान रहें, लेकिन देखने योग्य। सदस्य चर के रूप में हमेशा length का आह्वान करें।

क्या/क्या/इसे बदला जा सकता है?

केओ के डेवलपर्स पर बहुत जल्दी इस मुद्दे पर विचार किया गया; Github issue no 4 के आरंभ में। यह मुद्दा उन चीजों को समझाता है जिन्हें मैंने ऊपर कवर करने की कोशिश की है, और यह भी दिखाता है कि अंत में इसे बदलने के लिए बहुत कुछ नहीं किया जा सकता था।

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