2012-03-04 17 views
7

के साथ AJAX कॉल के बाद ताज़ा सूची में मेरे पास एक पृष्ठ पर अनुलग्नकों की एक सूची है जो jQuery $.ajax कॉल और नॉकआउट जेएस का उपयोग करके जेनरेट की गई है।नॉकआउट जेएस

मेरे एचटीएमएल की तरह लग रहा है (यह वापस छीन लिया जाता है):

$(function() { 
    getFormAttachments(); 
}); 

function getAttachments() { 
    var request = $.ajax({ 
    type: "GET", 
    datatype: "json", 
    url: "/Attachment/GetAttachments" 
    }); 

    request.done(function (response) { 
    ko.applyBindings(new vm(response)); 
    }); 
} 

मेरा विचार मॉडल:

<tbody data-bind="foreach: attachments"> 
    <tr> 
    <td data-bind="text: Filename" /> 
    </tr> 
</tbody> 

मैं एक समारोह है कि संलग्नक जो एक JSON प्रतिक्रिया के रूप में दिया जाता है की सूची हो जाता है ऐसा लगता है:

function vm(response) { 
    this.attachments = ko.observableArray(response); 
}; 

एक ताज़ा बटन है जिसका उपयोग इस सूची को रीफ्रेश करने के लिए क्लिक कर सकता है क्योंकि से अधिक समय संलग्नक जोड़े गए हो सकते/हटाया:

$(function() { 
    $("#refresh").on("click", getAttachments); 
}); 

अनुलग्नकों की सूची के प्रारंभिक प्रतिपादन, ठीक है, लेकिन जब मैं ताज़ा करें बटन के माध्यम से फिर से getAttachments फोन क्लिक करें सूची में जोड़ा जाता (वास्तव में प्रत्येक आइटम है कई बार डुप्लिकेट)।

मैं यहाँ इस समस्या को प्रदर्शित करने के लिए एक jsFiddle बना लिया है:

http://jsfiddle.net/CpdbJ/137

क्या मैं गलत कर रहा हूँ?

+0

केवी - अच्छी पोस्ट। मैं अभी भी थोड़ा उलझन में हूँ। नॉकआउट के लिए नया। मुझे पृष्ठ लोड पर AJAX डेटा के साथ एक व्यूमोडेल लोड करने में समान समस्याएं आ रही हैं। मुझे यकीन है कि मैं एक छोटा लेकिन गंभीर बिंदु खो रहा हूँ। एक बात जो मुझे भ्रमित करती है वह कुछ ट्यूटोरियल एक ऑब्जेक्ट के रूप में 'व्यूमोडेल' दिखाता है (उदा। 'var viewmodel = {something: ko.observable()} ') और अन्य फ़ंक्शन के रूप में (उदा।' फ़ंक्शन व्यूमोडेल() {this.something = को।देखने योग्य()} ') - कोई सुझाव? –

+0

@ one.beat.consumer - मेरा अनुवर्ती प्रश्न देखें: http://stackoverflow.com/questions/9589419/difference-between-knockout-view-models-declared-as-object-literals-vs- कार्यक्षमताओं - उत्तर और नीचे दी गई टिप्पणियों को चीजों को स्पष्ट करना चाहिए। मैं $ 25 खर्च करने और इसे देखने की अनुशंसा करता हूं: http://www.pluralsight-training.net/microsoft/Courses/TableOfContents?courseName=knockout-mvvm – Kev

+0

मैं आपका अन्य प्रश्न देखेंगे; धन्यवाद। मेरे पास एक बहुमूल्य सदस्यता है और मैंने इसे 2-3 बार देखा है ... वे मुश्किल से सतह को खरोंच करते हैं और इसमें से अधिकांश पुराना है कि 2.0 बाहर है, वे 1.2 या 1.3 बीटा का उपयोग कर रहे थे ... –

उत्तर

10

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

http://jsfiddle.net/CpdbJ/136

एचटीएमएल

<table> 
    <thead> 
     <tr><th>File Name</th></tr> 
    </thead> 
    <tbody data-bind="foreach: attachments"> 
     <tr><td data-bind="text: Filename" /></tr> 
    </tbody> 
</table> 
<button data-bind="click: refresh">Refresh</button> 

जावास्क्रिप्ट

$(function() { 
    var ViewModel = function() { 
    var self = this; 

    self.count = 0; 
    self.getAttachments = function() { 
     var data = [{ Filename: "f"+(self.count*2+1)+".doc" }, 
        { Filename: "f"+(self.count*2+2)+".doc"}]; 
     self.count = self.count + 1; 
     return data; 
    } 

    self.attachments = ko.observableArray(self.getAttachments()); 

    self.refresh = function() { 
     self.attachments(self.getAttachments());   
    } 
    }; 

    ko.applyBindings(new ViewModel()); 
}); 

-

तुम भी मानचित्रण प्लगइन को देखने के लिए चाहते हो सकता है - http://knockoutjs.com/documentation/plugins-mapping.html। यह जेएसओएन को व्यू मॉडल में बदलने में आपकी मदद कर सकता है। इसके अतिरिक्त यह किसी ऑब्जेक्ट के लिए "कुंजी" होने के लिए एक संपत्ति असाइन करने में सक्षम है ... इसका उपयोग बाद के मैपिंग पर पुराने बनाम नई ऑब्जेक्ट्स को निर्धारित करने के लिए किया जाएगा।

यहाँ एक बेला मैं एक समय पहले लिखा था एक समान विचार प्रदर्शित करने के लिए है:

http://jsfiddle.net/wgZ59/276

नोट: मैं अपने मैपिंग नियम के भाग के रूप 'अपडेट' का उपयोग, लेकिन केवल इसलिए मैं करने के लिए लॉग इन कर सकते कंसोल। यदि आप मैपिंग प्लगइन अद्यतन वस्तुओं को कैसे अनुकूलित करना चाहते हैं, तो आपको केवल इसे जोड़ना होगा।

+0

यह कैसे काम करेगा यदि यह काम करेगा कहें कि मेरे पास कोई डेटा नहीं था, और मुझे अजाक्स विधि और उसे एक GET कॉल करने की आवश्यकता है? – Vyache

+0

AJAX कॉल करने के लिए बस GetAttachments कॉल को बदलें, और कॉलबैक में परिणामों को अनुलग्नक देखने योग्य सरणी में सीधे सेट करें। ताज़ा करें केवल self.getAttachments() को कॉल करेंगे। अनुलग्नकों को खाली प्रारंभ किया जाएगा, और फिर आप पहले AJAX कॉल करने के लिए स्वयं .getAttachments() को तुरंत कॉल कर सकते हैं। एक बार कॉलबैक परिणाम सेट करने के बाद नॉकआउट आपके यूआई को रीफ्रेश करने का ख्याल रखेगा। –

+0

हम्म, किसी कारण से मैं इस विधि के साथ अपने डेटा को रीफ्रेश नहीं कर सकता, मेरा प्रश्न देखें: http://stackoverflow.com/questions/21558075/how-do-i-update-my-model-using-ajax-and -mapping-प्लगइन – Vyache

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