2014-11-19 7 views
14

मेरे पास एक व्यूमोडेल है जिसमें एक अवलोकन योग्य है, जिसे किसी ऑब्जेक्ट के साथ प्रारंभ किया गया है। इस ऑब्जेक्ट में स्वयं अवलोकन योग्य हैं।नॉकआउट अवलोकन करने योग्य जटिल ऑब्जेक्ट में किसी भी बदलाव की सदस्यता लें

मेरा लक्ष्य अधिसूचित किया जाना है जब भी उस वस्तु परिवर्तन (या: जब उस वस्तु परिवर्तन में किसी भी नमूदार)

jsfiddle

जटिल वस्तु:

var ns = ns || {}; 

ns.ComplexObj = function (item) { 
    var self = this; 

    if (!item) { 
     item = {}; 
    } 

    self.id = item.Id || ''; 
    self.company = ko.observable(item.Company || ''); 
    self.email = ko.observable(item.Email || ''); 

    self.company.subscribe(function() { 
     console.log('debug: company changed'); 
    }); 

    return self; 
}; 

viewmodel

ns.mainvm = function() { 
    var simpleObject = ko.observable('i am pretty simple'); 

    simpleObject.subscribe(function (newValue) { 
     document.getElementById('simpleSubscribtionFeedback').innerText = newValue; 
    }); 

    var complexObject = ko.observable(ns.ComplexObj()); 
    complexObject.subscribe(function (newValue) { 
     // i would like to react to any change in complex object 
     document.getElementById('complexSubscribtionFeedback').innerText = 'i dont get executed :('; 
    }); 

    return { 
     simpleObject: simpleObject, 
     complexObject: complexObject 
    }; 
}; 

बाध्यकारी

var container = document.getElementById('wrapper'); 
if (container) { 
    ko.applyBindings(ns.mainvm, container); 
} else { 
    console.warn("container for binding ko not found"); 
} 

वहाँ एक जटिल वस्तु पर परिवर्तन पर प्रतिक्रिया करने के लिए किसी भी possiblity है? किसी भी मदद की सराहना की है।

मैंने पहले से ही rpniemeyer से dirtyFlag समाधान (टिप्पणियों में लिंक) की कोशिश की है। जटिल वस्तु पर गंदे झंडे की समस्या यह है कि जब यह "सत्य" पर स्विच हो जाता है और मैं उस ध्वज की सदस्यता में झुका रहा हूं, तो यह केवल पहली बार ठीक है। आगे के बदलावों पर प्रतिक्रिया करने के लिए, मुझे गंदे फ्लैग को फिर से झूठ में सेट करने की आवश्यकता होगी (सदस्यता में मेरी सामग्री करने के बाद)। जो एक सदस्यता पाश में नेतृत्व करेंगे।

+0

[यह पोस्ट] (https://roysvork.wordpress.com/2014/01/12/tracking-changes-to-complex-viewmodels-with-knockout-js/) आपको शुरू हो सकता है। – Michael

+0

आपकी टिप्पणी के लिए धन्यवाद! मैंने नीचे अपना प्रश्न संपादित किया। –

+1

यह प्लगइन ठीक वही कर रहा है जो आपने किया था: https://github.com/ZiadJ/knockoutjs-reactor – Domysee

उत्तर

29

आप निम्नलिखित चाल का उपयोग कर सकते हैं:

ko.computed(function() { 
    return ko.toJSON(complexObject); 
}).subscribe(function() { 
    // called whenever any of the properties of complexObject changes 
}); 

http://jsfiddle.net/xcajt4qn/3/

कारण है कि इस काम करता है ko.toJSON रिकर्सिवली वस्तु में सभी गुण पढ़ा जाएगा देखो, इसलिए गणना की सभी गुणों पर निर्भर कर रही है ।

+2

अच्छा, बहुत बहुत धन्यवाद! –

+3

आप इस चाल को खोजने के लिए पागल हो गए हैं। लेकिन यह भी कमाल है। – kernel

+4

ध्यान दें कि जब भी किसी ऑब्जेक्ट की * गैर * -बर्जेबल गुणों में परिवर्तन होता है, तो यह भी कहा जाएगा, जो वांछित नहीं हो सकता है। – tloflin

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