2012-05-25 16 views
18

से बाध्य तत्व प्राप्त करें क्या संबंधित तत्व (या तत्व) प्राप्त करना संभव है कि डेटा (मॉडल) उदाहरण बाध्य था?KnockoutJs: मॉडल उदाहरण

उदाहरण के लिए, मेरे पास व्यूमोडेल संपत्ति में 'व्यक्ति' ऑब्जेक्ट स्टोर की एक श्रृंखला है।

<div class="people" data-bind="template: { foreach: people }"> 
    <a href="#" class="person" data-bind="text: name"></a> 
</div> 

मैं तो jQuery के माध्यम से कुछ ईवेंट हैंडलर्स बाँध:: मेरे showPerson विधि में

$container.on('click', '.person', function(e){ 
    e.preventDefault(); 
    self.showPerson(ko.dataFor(this)); 
}); 

मैं एक बचत होगी

मैं दृश्य जो यह renders, जैसे करने के लिए ViewModel बाँध मॉडल के संदर्भ में। मैं तत्व के संदर्भ को सहेज सकता/सकती हूं, लेकिन मैं नहीं चाहता कि मुझे ऐसा करना पड़े।

self.showPerson = function(person) { 
    // can i get the corresponding element from the 'person' model? 
}; 

किसी को भी कोई विचार है?

उत्तर

8

आपका वाक्यविन्यास और jquery के साथ $ कंटेनर का उपयोग और '.person' का दूसरा तर्क unfamil है मेरे लिए iar, लेकिन आपके क्लिक हैंडलर में, this पर क्लिक किया गया तत्व नहीं था? क्या आप इसे अपने शोपर्सन विधि में भी पास नहीं कर सके?

$container.on('click', '.person', function(e){ 
    e.preventDefault(); 
    self.showPerson(ko.dataFor(this), this); 
}); 

self.showPerson = function(person, element) { 
    // can i get the corresponding element from the 'person' model? 
}; 

मैं अपने सिर के ऊपर से एक तरह से तत्व है कि एक नमूदार के लिए बाध्य है पाने के लिए के बारे में पता नहीं है, लेकिन यह कई अलग अलग तत्व हो सकता है। आपके पास 'नाम' के लिए एक टेक्स्ट बॉक्स हो सकता है, एक अवधि में नाम प्रदर्शित कर सकते हैं, इसे गणना में उपयोग कर सकते हैं, सब्सक्राइबर हो सकते हैं, और उदाहरण के लिए किसी अन्य बाध्यकारी में गणना में लंबाई() लंबाई का उपयोग कर सकते हैं।

यह कहा गया है कि, यदि आप नॉकआउट के डीबग संस्करण का उपयोग करते हैं, तो आप देख सकते हैं कि आपके अवलोकनों में _subscriptions संपत्ति है जो आप ढूंढ रहे हैं। छोटा संस्करण मुझे लगता है कि कुछ एकल चरित्र है।

+0

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

5

अपने foreach के अंदर क्लिक ईवेंट बाध्यकारी क्यों नहीं ले जाएं?

<a href="#" class="person" data-bind="text: name, click: showPerson"></a>

इस मामले में, अपने showPerson() समारोह के लिए सही डेटा होता person

संपादित करें:

क्षमा करें, लेकिन मुझे लगता है मैं अपने प्रश्न के कोर याद किया:

self.showPerson = function (person, event) { 
    element = event.srcElement 
    ... 
} 
+0

उत्तर के लिए धन्यवाद, लेकिन है कि मैं क्या पूछ रहा हूँ नहीं है। 'शोपर्सन()' सही डेटा प्राप्त करता है। मैं पूछ रहा हूं कि क्या मैं मॉडल उदाहरण से संबंधित तत्व प्राप्त कर सकता हूं जो 'शोपर्सन() ' – badsyntax

+0

event.srcElement में केवल आईई में काम करता है। – vijayst

0
self.showPerson = function(data, event) { 
    // event.currentTarget is the DOM element 
    // $(event.currentTarget) gives the jQuery element 
} 
+1

मैं पूछ रहा था कि क्या मैं मॉडल से तत्व प्राप्त कर सकता हूं, घटना ईवेंट हैंडलर पैरामीटर से नहीं। – badsyntax

15

आप बस एक कस्टम बाध्यकारी

// data-bind="element: observable" 
    // sets observable to element .. 
    ko.bindingHandlers.element = { 
     init: function(element, valueAccessor) { 
      var target = valueAccessor(); 
      target(element); 
     } 
    }; 

आपके विचार मॉडल में बना सकते हैं, तत्व स्टोर करने के लिए एक 'क्षेत्र' बनाने:

person.el = ko.observable(null); 
अपने html टेम्पलेट में

फिर ..

<div data-bind="element: el"> .... </div> 
+2

यह उत्तर होना चाहिए था, क्योंकि यह पृष्ठ पर एकमात्र समाधान है जो मुझे अंदरूनी दृश्य मॉडल से बाध्य तत्व तक पहुंचने देता है, न कि क्लिक होने पर, लेकिन जैसे ही यह बाध्य होता है। –

0

मुझे लगता है कि सर्वोत्तम अभ्यास टी है o हैंडलर संलग्न करने के बजाय दृश्य मॉडल पर सीधे एक फ़ंक्शन से बांधें।

Click binding to parent function in foreach

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