2012-11-03 9 views
6

मैं knockout.js का उपयोग कर रहा हूँ। मैं थोड़ा अजीब परिस्थिति में फंस गया हूं (इसकी व्याख्या करना मुश्किल है लेकिन मैं कोशिश कर रहा हूं, क्षमा करें अगर मैं स्पष्ट नहीं हूं)। मैं कस्टम बाइंडिंग का उपयोग कर रहा है और विकल्प एक भी selectList पर बाध्यकारी:नॉकआउट बाइंडिंग का ऑर्डर कैसे करें?

<select data-bind="options : arrayOfOptions, optionsText: 'Name', 
      optionsValue: 'Name', chosen: { }"> 
    </select> 

ko.bindingHandlers.chosen = { 
    init: function (element, valueAccessor, allBindingAccessor, 
        viewModel, bindigContext) { 
     var options = ko.utils.unwrapObservable(valueAccessor() || {}); 
     $(element).chosen(options); 
    } 
}; 

यहाँ क्रम selectList पर arrayOfOptions सरणी और chosen से सभी उपलब्ध विकल्पों के साथ भर जाएगा एक कस्टम बाध्यकारी है, जिसमें मैं एक CHOSEN PLUGIN से आवेदन करने वाली हूं चयन सूची।

अब जिस समस्या का मैं सामना कर रहा हूं वह यह है कि जब मैं लागू होता हूं तो कस्टम बाध्यकारी में उस समय चयन सूची पर प्लगइन का चयन करें, तो चयनसूची arrayOfOptions सरणी के विकल्पों से भरा नहीं है। custom binding एक साधारण शब्द में मतलब options binding से पहले निष्पादित हो रहा है। क्या कोई मुझे इसके लिए समाधान दे सकता है ताकि कस्टम बाइंडिंग विकल्प बाध्यकारी के बाद लागू हो?

उत्तर

4

अपडेट में chosen पर अपनी कॉल ले जाएं।

http://jsfiddle.net/jearles/avSfa/28/

-

ko.bindingHandlers.chosen = { 
    init: function(element, valueAccessor, allBindingsAccessor, viewModel) { 
     var allBindings = allBindingsAccessor(); 

     var options = {default: 'Select one...'}; 
     $.extend(options, allBindings.chosen) 

     $(element).attr('data-placeholder', options.default);     
    }, 
    update: function(element, valueAccessor, allBindingsAccessor, viewModel) { 
     $(element).chosen(); 
    } 
}; 

-

वैकल्पिक रूप से, आप setTimeout का उपयोग निष्पादन कतार में नीचे chosen करने के लिए कॉल स्थानांतरित करने के लिए कर सकते हैं। यह chosen से पहले अपने काम करने के लिए नॉकआउट विकल्प बाध्यकारी समय देगा, इसे बदलने की कोशिश करता है।

ko.bindingHandlers.chosen = { 
    init: function (element, valueAccessor, allBindingAccessor, 
        viewModel, bindingContext) { 
     var options = ko.utils.unwrapObservable(valueAccessor() || {}); 
     setTimeout(function() { $(element).chosen(options); }, 0); 
    } 
}; 
+0

2 उदाहरण में, विकल्प एक खाली वस्तु को setTimeout कहा जाता है से पहले सेट हो जाएगा (और खाली रहेगी)। सेटटाइमेट ट्रिगर होने पर इसे असाइन करने की आवश्यकता होती है। –

1
ko.bindingHandlers.chosen = { 
init: function (element, valueAccessor, allBindingsAccessor, viewModel) { 
    var options = allBindingsAccessor().options; 

    options.subscribe(function (newValue) { 
     $(element).chosen(); 
     $(element).trigger("chosen:updated"); 
    }); 

    var value = allBindingsAccessor().value; 
    value.subscribe(function (newValue) { 
     $(element).trigger("chosen:updated"); 
    }); 
}, 
update: function (element, valueAccessor, allBindingsAccessor, viewModel) { 
    if (element.options.length > 0) { 
     $(element).chosen(); 
     $(element).trigger("chosen:updated"); 
    } 
} 

};

यह KO जे एस के साथ मेरे लिए काम किया 3.0

+0

+1, इसने मुझे एक समान समस्या के समाधान के लिए प्रेरित किया, अच्छा पैटर्न जब आप अपने कस्टम बाध्यकारी कुछ अन्य बाध्यकारी के बाद कुछ करना चाहते हैं (लेकिन यदि आप इसे केवल एक बार चलाने के लिए चाहते हैं, तो आप ग्राहक को भी नष्ट कर सकते हैं)। –

0

जवाब ऊपर समस्या यह है कि प्रस्तुत किया गया था का समाधान हो सकता है, वे इस तरह के { 'disable_search पास करके खोज को अक्षम करने के रूप में, डाउन मेनू अपनी चुनी ड्रॉप अनुरूपण पर कम होना प्रतीत ':सच}।

मैं आपके बाध्यकारी में चुने गए अनुकूलन को पारित करने की अनुमति देने के लिए निम्न संशोधनों का सुझाव देता हूं।

<select data-bind="options : arrayOfOptions, optionsText: 'Name', 
    optionsValue: 'Name', chosen: { 'disable_search': true }"> 
</select> 

ko.bindingHandlers.chosen = { 
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) { 
     var options = allBindingsAccessor().options; 
     var chosenOptions = allBindingsAccessor().chosen; 

     options.subscribe(function (newValue) { 
      $(element).chosen(chosenOptions); 
      $(element).trigger("chosen:updated"); 
     }); 

     var value = allBindingsAccessor().value; 
     value.subscribe(function (newValue) { 
      $(element).trigger("chosen:updated"); 
     }); 
    }, 
    update: function (element, valueAccessor, allBindingsAccessor, viewModel) { 
     if (element.options.length > 0) { 
      var chosenOptions = allBindingsAccessor().chosen; 
      $(element).chosen(chosenOptions); 
      $(element).trigger("chosen:updated"); 
     } 
    } 
}; 
8

बाध्यकारी हैंडलर नामों की एक सरणी के साथ संपत्ति के बाद एक संपत्ति बनाएं जो इस बाध्यकारी पर निर्भर करता है।

ko.bindingHandlers.chosen = { init: function (element, valueAccessor, allBindingAccessor, viewModel, bindigContext) { var options = ko.utils.unwrapObservable(valueAccessor() || {}); $(element).chosen(options); }, after:['options'] };

+0

@ user1740381 क्या यह वही नहीं है जो आप खोज रहे हैं? – DrSammyD

+0

मैंने वास्तव में सोचा कि यह काम करेगा, लेकिन मैं इसे काम करने के लिए प्रबंधित नहीं कर सकता। इसके बाद: ['विकल्प'] काम नहीं कर रहा है ... बाद के सरणी में क्या है? जहां तक ​​मैं देख सकता हूं प्रलेखन में इसका भी उल्लेख नहीं किया गया है ... –

+2

यहां एक [jsfiddle] (http://jsfiddle.net/2uaLxdrk/) है। '['विकल्प'] 'बाइंडिंग हैंडलर नामों की एक सूची है, और यह जांच करेगी कि वर्तमान डेटा-बाइंड में से कोई भी इसमें शामिल है या नहीं और यह बाध्य होने के बाद तक स्थगित हो जाएगा।और आप सही हैं, यह दस्तावेज़ों में नहीं है, मैंने इसे स्रोत कोड में पाया है। – DrSammyD

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