2011-09-11 13 views
6

मैं jQueryUI टैब जोड़ने/निकालने के लिए नॉकआउट का उपयोग करने का प्रयास कर रहा हूं लेकिन कोई भाग्य नहीं है। मेरा दृश्य मॉडल प्रभाव वस्तुओं की एक सरणी है। मुझे टैब नियंत्रण से जोड़ा गया/हटाया गया टैब चाहिए क्योंकि दृश्य मॉडल से वस्तुओं को जोड़ा/हटा दिया गया है।knockout JS का उपयोग करके jQueryUI टैब को कैसे जोड़ें या निकालें?

यहाँ एक JSFiddle किसी शुरू कर दिया और मैं अद्यतन जो दिखाता है कि मैं क्या JSFiddle example

जब आप टैब जोड़ने की कोशिश यह टूट जाएगा करने के लिए देख रहा हूँ है। मुझे लगता है कि मुझे टेम्पलेट बाइंडिंग डब्ल्यू/एक नया कस्टम बाध्यकारी गठबंधन करने की आवश्यकता है जो मुझे लगता है कि टैब नियंत्रण को नष्ट/पुन: बना सकता है। मैं किसी भी मदद की सराहना करता हूं। धन्यवाद!

उत्तर

0

मॉडल बदलते समय आपको टैब इंटरफ़ेस को फिर से प्रस्तुत करना होगा। ,

<ul id="tabs"> 

हर बार जब मॉडल परिवर्तन फोन

$("#tabs").tabs(); 

(मैं नॉकआउट लेकिन मैं के साथ एक घटना बंद आग कैसे अनिश्चित हूं:

इसके अलावा, टैब <ul> को एक विशिष्ट आईडी जोड़ने मुझे यकीन है कि यह प्रलेखन में है।)

0

मेरे पास एक बहुत ही समान समस्या थी। मेरे पास एक गहरी दृश्य मॉडल ग्राफ़ है जहां बाल दृश्य मॉडल के शीर्ष स्तर के अवलोकन योग्य सरणी को टैब के रूप में दर्शाया जाता है, और प्रत्येक टैब पोते के डेटा के लिए मार्कअप प्रस्तुत करता है। मूल रूप से मैं नॉकआउट के निर्माण के बाद अपने मार्कअप को टैबलेट करने के लिए jQuery UI टैब का उपयोग कर रहा था।

मेरे पास उन टैबबड व्यू मॉडल/डोमेन ऑब्जेक्ट्स को जोड़ने, हटाने और डुप्लिकेट करने की कार्यक्षमता है। JQuery UI टैब के साथ मैंने इसे नष्ट करने के लिए कॉल किया और फिर इसे पुनर्निर्माण किया, और डुप्लिकेट जैसे मामलों के लिए मुझे पहले चयनित इंडेक्स को स्टोर करना पड़ा और फिर नए बनाए गए टैब का चयन करने के लिए मनोरंजन के बाद उस इंडेक्स + 1 का चयन करना पड़ा।

लेकिन अब मैं अपने यूआई के चालक के रूप में एमवीवीएम को पूरी तरह से गले लगाने आया हूं और jQuery टैब को पूरी तरह से जोड़ दिया है और अपने नॉकआउट व्यू मॉडलों पर "आईसलेक्टेड" अवलोकन योग्य संपत्ति में अपने स्वयं के टैब हेडर और टैब सामग्री तत्वों को बाध्य कर दिया है । मैंने इसे बहुत साफ करने के लिए पाया है और मुझे और अधिक लचीलापन देता है, और टैब के लिए मार्कअप/सीएसएस सरल और सुरुचिपूर्ण साबित हुआ।

यह चुना गया संपत्ति का भी अर्थ है कि मैं प्रत्येक टैब के लिए <div class="child" data-bind="if: isSelected"> जैसे कुछ निर्दिष्ट करके बाध्यकारी दक्षता बढ़ा सकता हूं। पहले (अनुमानतः) अदृश्य टैब अदृश्य टैब की सभी बाइंडिंग के माध्यम से काम नहीं कर रहा था।

इस प्रकार मैं आम तौर पर अपने यूआई से संपर्क करने की कोशिश कर रहा हूं - बाइंडिंग का उपयोग करने के पक्ष में जितना संभव हो सके सीधी प्रक्रियात्मक UI सामग्री से बचें।

3

मैंने सोचा कि मैं इस प्रश्न को एक समाधान पर एक नए टेक के साथ अपडेट कर दूंगा जिसका उपयोग मैंने शुरू किया था। मैं पहले आरओ निमेयर के फीड http://jsfiddle.net/rniemeyer/dsKbH/ का उपयोग कर रहा था क्योंकि केओ अवलोकन योग्य ऐरे से जुड़े jQuery UI टैब को गतिशील रूप से जोड़/हटाया जा रहा था।

पिछले कुछ महीनों में मैंने ए से संबंधित मेरे ऐप में कुछ समस्याओं के खिलाफ उछाल दिया है) सेटटाइमआउट() स्थगित, और बी) हर बार अपडेट ट्रिगर होने पर टैब विजेट का विनाश और पुन: निर्माण। तो मैं एक अलग दृष्टिकोण के साथ आया जो इन मुद्दों से बचाता है, और आईएमएचओ, एक और अधिक सुरुचिपूर्ण तकनीक है।

http://jsfiddle.net/LatencyMachine/XJPJZ/

कुंजी विचार एक बहुत ही सरल कस्टम "tabPanel" कहा जाता है बंधन और एक इसी विजेट है कि आप अपने टैब पैनल सामग्री divs करने के लिए बाध्य शुरू करने की है। चूंकि केओ आपके पर्यवेक्षण के आधार पर इन divs को बनाता है और हटा देता है, टैबपैन बाध्यकारी jQueryUI.tabs को "रीफ्रेश" विधि का उपयोग करके अपडेट करना सुनिश्चित करता है। कंटेनर तत्व की बाइंडिंग में टैब को अपडेट करने के लिए टैब (और सही समय पर) प्राप्त करने की कोशिश करने से मुझे लगता है कि यह बहुत आसान काम करता है।

बेला से प्रासंगिक कोड

/** 
KO Binding handler for a tabPanel div. Use this on divs that can appear/disappear and/or have their id change 
depending upon an observable, usually an observableArray. 
*/ 
ko.bindingHandlers.tabPanel = { 
    update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {   
     $(element).tabPanel(ko.toJS(valueAccessor())); 
    } 
}; 

/** 
This widget facilitates jQuery UI tabs that appear and disappear dynamically, usually as a result of MVVM like Knockout 
Whenever this widget is created, the containing jQuery UI 'tabs' widget is refreshed so that it picks up the new tab 
or drops the removed one. 
This also facilitates dealing with id rename 'ripple' that occurs whenever a tab is removed due to the splice of an 
observable array. 
*/ 
$.widget("bw.tabPanel", { 
    options: { 
     id: null 
    }, 

    _create: function() { 
     this.element.hide(); 
     this.tabsElement = this.element.closest(".ui-tabs");   

     if(this.options.id) { 
      this.element.attr({id: this.options.id}); 
     } 
     this.refreshTabs(); 
    }, 

    _destroy: function() { 
     if(this.options.id) { 
      this.element.attr({id: ""}); 
     } 
     this.refreshTabs(); 
    }, 

    _setOption: function(key, value) { 
     var previousValue = this.options[key]; 
     if(previousValue == value) return; 

     this.options[key] = value; 

     switch(key) { 
      case "id": 
       this.element.attr({id: this.options.id}); 
       this.refreshTabs(); 
       break; 
     } 
    }, 

    /** 
    Invoke refresh on the parent tab to let it know that something has changed. 
    This also preserves the active index by setting it back to what it was before the refresh, which 
    may correspond to a different tab after the refresh. 
    */ 
    refreshTabs: function() { 
     var previousActiveIndex = this.tabsElement.tabs("option", "active"); 
     this.tabsElement.tabs("refresh"); 
     this.tabsElement.tabs("option", "active", previousActiveIndex);   
    } 
}); 
संबंधित मुद्दे