2013-09-05 6 views
36

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

मुझे ऑल सर्टिफिकेट्स की सामग्री को साफ़ करने की आवश्यकता है जब भी उपयोगकर्ता उपयोगकर्ता को CAApproval पृष्ठ पर लौटाता है जो उस अवलोकन योग्य का उपयोग करता है ताकि यदि कोई उपयोगकर्ता पृष्ठ छोड़ देता है और वापस आता है, तो अवलोकन योग्य की सामग्री शून्य होती है, और इसलिए नहीं डेटा स्क्रीन पर प्रदर्शित होता है। यहाँ मैं एक observablearray की सामग्री को हर बार पेज जब पेज के भीतर ही नेविगेट कोई उपयोगकर्ता किसी वेबपृष्ठ (नहीं करने के लिए आता कैसे साफ़ करूं code-

define(['services/logger', 'durandal/system', 'durandal/plugins/router', 'services/CertificateDataService','controls/Lucas'], 

     function(logger, system, router, CertificateDataService) { 
     var allCertificates = ko.observableArray([]); 

    var activate = function() { 
      // go get local data, if we have it 
      return SelectAllCerts(),SelectMyCerts(), GetCertificateDetails(), GetDDABankNums(); 
      }; 
     var vm = { 
      activate: activate, 
      allCertificates: allCertificates, 
    SelectAllCerts: SelectAllCerts 

     }); 

    return vm; 

    function SelectAllCerts() { 
       return CertificateDataService.getallCertificates(allCertificates); 
     } 
    }); 

मेरी viewmodel के मुख्य आकर्षण हैं, केवल observablearray स्पष्ट जब उपयोगकर्ता एक अलग पृष्ठ से आता है)?

function(logger, system, router, CertificateDataService) { 
    var allCertificates = ko.observableArray(); 

var activate = function() { 
    allCertificates([]); 
    // go get local data, if we have it 
    return SelectAllCerts(),SelectMyCerts(), GetCertificateDetails(), GetDDABankNums(); 
}; 

var vm = { 
    activate: activate, 
    allCertificates: allCertificates, 
    SelectAllCerts: SelectAllCerts 
}); 

उत्तर

31

बस यह कुछ भी नहीं (allCertificates([])) के बराबर अपने सक्रिय समारोह है, जो हर बार आपके विचार मॉडल लोड कहा जाता है में निर्धारित किया है। सभी वस्तुओं को साफ़ करने के लिए removeAll पर कॉल करें।
आधिकारिक साइट observable array manual पर देखें।

self.mycertificates = ko.observableArray(['C1', 'C2']); 
self.mycertificates.removeAll(); 
+0

बिल्कुल सही! धन्यवाद। अभी भी नॉकआउट के लिए उपयोग हो रही है। – Chris

+0

वाह। मैं अब 2 दिनों से अधिक के लिए एक समान जवाब की तलाश कर रहा हूं। इस के लिए बहुत बहुत धन्यवाद! –

56

भी पीटकर observableArray दिलचस्प तरीकों है -

+4

या तो पी याडब्ल्यू के जवाब के लिए कोई प्रदर्शन लाभ? –

+2

कम से कम यह अधिक पठनीय है। – Nisarg

3

जेरेमी टी (टिप्पणी में पर्याप्त जगह नहीं) के लिए।
पहला कारण और मेरे लिए बिल्कुल पर्याप्त वांछित उद्देश्य के लिए सार्वजनिक रूप से उपलब्ध एपीआई का अस्तित्व है।

लेकिन प्रदर्शन का अनुमान लगाने के लिए आप स्रोत की जांच कर सकते हैं। "अवलोकन योग्य" ऑब्जेक्ट में इंजेक्शन वाले अतिरिक्त कार्यों के साथ भी "देखने योग्य" है।

तो प्रारंभ इस तरह दिखता है:

ko.observableArray = function (initialValues) { 
    initialValues = initialValues || []; 

    if (typeof initialValues != 'object' || !('length' in initialValues)) 
     throw new Error("The argument passed when initializing an observable array must be an array, or null, or undefined."); 

    var result = ko.observable(initialValues); 
    ko.utils.extend(result, ko.observableArray['fn']); 
    return result.extend({'trackArrayChanges':true}); 
}; 

ko.observable = function (initialValue) { 
    var _latestValue = initialValue; 

    function observable() { 
     if (arguments.length > 0) { 
      // Write 

      // Ignore writes if the value hasn't changed 
      if (!observable['equalityComparer'] || !observable['equalityComparer'](_latestValue, arguments[0])) { 
       observable.valueWillMutate(); 
       _latestValue = arguments[0]; 
       if (DEBUG) observable._latestValue = _latestValue; 
       observable.valueHasMutated(); 
      } 
      return this; // Permits chained assignments 
     } 
     else { 
      // Read 
      ko.dependencyDetection.registerDependency(observable); // The caller only needs to be notified of changes if they did a "read" operation 
      return _latestValue; 
     } 
    } 
    if (DEBUG) observable._latestValue = _latestValue; 
    ko.subscribable.call(observable); 
    observable.peek = function() { return _latestValue }; 
    observable.valueHasMutated = function() { observable["notifySubscribers"](_latestValue); } 
    observable.valueWillMutate = function() { observable["notifySubscribers"](_latestValue, "beforeChange"); } 
    ko.utils.extend(observable, ko.observable['fn']); 

    ko.exportProperty(observable, 'peek', observable.peek); 
    ko.exportProperty(observable, "valueHasMutated", observable.valueHasMutated); 
    ko.exportProperty(observable, "valueWillMutate", observable.valueWillMutate); 

    return observable; 
} 

और सभी तत्वों को दूर इस तरह दिखता है:

'removeAll': function (arrayOfValues) { 
     // If you passed zero args, we remove everything 
     if (arrayOfValues === undefined) { 
      var underlyingArray = this.peek(); 
      var allValues = underlyingArray.slice(0); 
      this.valueWillMutate(); 
      underlyingArray.splice(0, underlyingArray.length); 
      this.valueHasMutated(); 
      return allValues; 
     } 
     // If you passed an arg, we interpret it as an array of entries to remove 
     if (!arrayOfValues) 
      return []; 
     return this['remove'](function (value) { 
      return ko.utils.arrayIndexOf(arrayOfValues, value) >= 0; 
     }); 
    } 
संबंधित मुद्दे