2012-08-29 20 views
5

मैं <select> तत्व के <option> एस बनाने के लिए, और इसके डिफ़ॉल्ट-चयनित मान को सेट करने के लिए knockout.js का उपयोग कर रहा हूं। तक अपेक्षित सभी कार्य मैं optionsValue बाध्यकारी जोड़ता हूं, जिस बिंदु पर ड्रॉपडाउन अब पृष्ठ लोड पर उचित प्रारंभिक मान नहीं दिखाता है।<select> तत्व के <option> एस दोनों पाठ और मूल्यों के साथ, और प्रारंभिक रूप से चयनित मूल्य भी सेट करने के लिए आप knockout.js का उपयोग कैसे करते हैं?

दूसरे शब्दों में, यह काम करता है:

<select data-bind="value: selectedAccount, options: accounts, optionsText: 'name'"></select> 

... लेकिन यह काम नहीं करता:

<!doctype html> 
<html> 
    <head> 
     <title>Demo</title> 
     <script src='knockout-2.1.0.debug.js'></script> 
    </head> 
    <body> 
     <select data-bind="value: selectedAccount, options: accounts, optionsText: 'name', optionsValue: 'id'"></select> 
     <script> 
      function QuickTransferViewmodel() 
      { 
       var self = this; 

       self.accounts = 
       [ 
        { id: 0, name: "Spending" }, 
        { id: 1, name: "Savings" } 
       ]; 

       self.selectedAccount = ko.observable(self.accounts[1]); 
      } 
      ko.applyBindings(new QuickTransferViewmodel()); 
     </script> 
    </body> 
</html> 

मैं:

<select data-bind="value: selectedAccount, options: accounts, optionsText: 'name', optionsValue: 'id'"></select> 

यहाँ मेरी सरलीकृत, पूरा कोड है ड्रॉपडाउन डिफ़ॉल्ट रूप से चुने गए "बचत" को दिखाने की अपेक्षा करेगा। यह केवल तभी करता है जब मैं विकल्पों को हटा देता हूं।

अग्रिम धन्यवाद!

+0

सीधे आपके प्रश्नों से संबंधित नहीं है, लेकिन यदि आप 'value' बाइंडिंग 'विकल्प' से पहले हैं तो आपको कुछ असामान्य परिणाम मिल सकते हैं। –

उत्तर

4

optionsValue बंधन निर्धारित करने के लिए जो संपत्ति उत्पन्न option तत्वों पर value विशेषता निर्धारित करने में प्रयोग किया जाता है प्रयोग किया जाता है।

इस एक पंक्ति का परिवर्तन मेरे लिए अपने नमूना काम करता है:

self.selectedAccount = ko.observable(1);

आपका value बंधन selectedAccount के लिए निर्धारित है जो एक आईडी है, और अपने उत्पन्न options तत्वों में मूल्यों वास्तव में आईडी कर रहे हैं।

+0

आह, धन्यवाद! यह समझ आता है। Knockout.js प्रलेखन और ट्यूटोरियल में, वे विकल्पों का उपयोग नहीं करते हैं बाध्यकारी। मुझे लगता है कि निर्दिष्ट विकल्प-मूल्यों की अनुपस्थिति में, knockout.js स्वचालित रूप से विकल्प को बाध्य सरणी में आइटम्स के संदर्भ के रूप में ट्रैक करता है। लेकिन जैसा कि आपने बताया है, यदि आप विकल्पों को निर्दिष्ट करते हैं तो यह अलग-अलग काम करता है। यही कारण है कि मेरा कोड तभी काम करता था जब विकल्प वैल्यू छोड़ दिया गया था। एक बार फिर धन्यवाद! – Bryan

0

आप "मूल्य" विकल्पों की सूची में लोगों में से एक बनाने के लिए है .....

मैं इस संभाल करने के लिए कुछ coffeescript लेखन समाप्त हो गया ....

replaceWithMatchingExt = (observableToFind, observablePropertyToSet, list, match) -> 
    return if not observablePropertyToSet 
    return if not observableToFind() 
    return if list.length == 0 
    observablePropertyToSet (x for x in list when x[match]() == observableToFind()[match]())[0] 

replaceWithMatching = (prop, list, match) -> 
    replaceWithMatchingExt(prop, prop, list, match)  

जो तब मेरे लिए अनुमति देता है (यह भी coffeescript ...)

replaceWithMatching @Product, @Products(), 'Id' 

यह देखते हुए कि उत्पाद मूल्य है, उत्पाद विकल्पों की सूची में है .... और 'Id' संपत्ति मैं पर मिलान करना चाहते है। यानी, आईडी वह है जो मैं समकक्ष उत्पादों को काम करने के लिए उपयोग कर सकता हूं।

कोड तब ऑब्जेक्ट के साथ अवलोकन योग्य उत्पाद को प्रतिस्थापित करता है जो उत्पाद सूची में है यदि यह किसी से मेल खाता है।