5

के साथ गतिशील अवलोकन योग्य सरणी को रीसेट कैसे करें मैं कुछ आलसी लोडिंग तकनीक का उपयोग कर नए मूल्य के साथ अवलोकन योग्य सरणी को रीसेट नहीं कर सकता। मैं साफ़ कर सकता हूं लेकिन रीसेट नहीं कर सकता, लेकिन यह मुझे नए गतिशील मूल्य जोड़ने की इजाजत नहीं देता है।नॉकआउट - नए मान

बेला http://jsfiddle.net/kspxa8as/

js

var i = 1; 
      optionsProvider = function(self) { 
       var self = self || {}; 
       self.options = {}; 
       self.get = function(name, initialValue) { 
        if (!self.options[name]) { 
         console.log("Called - " + name); 
         self.options[name] = ko.observableArray([initialValue]); 
         var requestHeader = ''; 
         setTimeout(function() { 
          var aa = [{name: "plant 1" + i, selected: true}, {name: "palnt 2" + i, selected: false}]; 
          self.options[name](aa); 
          i++; 
         }, 2000); 
        } 
        return self.options[name]; 
       }; 
       return self; 
      }; 
      ViewModel = function() { 
       var self = this; 
       var k = 1; 
       var ob = new optionsProvider(self); 
       self.PlantSelected = ob.get("name" + k, ''); 
       self.fillNewSelect = function() { 
        self.PlantSelected.removeAll(); 
        self.PlantSelected().push(ob.get("name" + k, '')); 
        k++; 
       }; 
      }; 
      ko.applyBindings(new ViewModel()); 

एचटीएमएल

<select class="n_imported_country"      
      data-bind="options: PlantSelected, 
           optionsText :'name' 
      " 
      > 
    </select> 
    <div data-bind="click: function(){ 
     $root.fillNewSelect(); 
    }">click to fill new select value</div> 

मैं एक नौसिखिया पीटकर करने, अपने जवाब महान स्वागत कर रहा हूँ। इस तरह

+0

उपयोग 'self.PlantSelected.push (ob.get (" नाम "+ K, ''));' 'बजाय()'। '() 'पढ़ने के लिए प्रयुक्त होता है जैसे कि आपको इसमें कुछ डेटा जोड़ने की आवश्यकता है, आपको घोषित इंस्टेंस i.e' sel.PlantSelected = ko.observableArray()' चीयर्स –

+0

पर काम करने की आवश्यकता नहीं है, बस इसे ड्रॉप डाउन में प्रिंट करें। मैं y –

+0

क्यों नहीं जानता 'टाइमआउट' क्यों? – haim770

उत्तर

0

कोशिश कुछ चाल यहां कार्य करने के लिए observableArray के कहने से गुजर रहा है और हमारा काम कर पाने

ViewModel:

var ViewModel = function() { 
     var self = this; 
     var k = 1; 
     var ob = new optionsProvider(self); 
     self.PlantSelected = ko.observableArray(); //Declare it as observableArray 
     ob.get("name" + k, '',self.PlantSelected) // call the function passing observableArray instance 
     self.fillNewSelect = function() 
     { 
      self.PlantSelected.removeAll(); 
      ob.get("name", ''+ k,self.PlantSelected) 
      k++; 
     }; 
    }; 
ko.applyBindings(new ViewModel()); 

समारोह:

var i = 1; 
    optionsProvider = function(self) { 
     var self = self || {}; 
     self.options = {}; 
      self.get = function(name, initialValue,instance) { //pass observableArray instance here 
      if (!self.options[name] || self.options[name]()) { 
      var requestHeader = ''; 

      setTimeout(function() { 
      var aa = [{name: "plant 1" + i, selected: true}, 
         {name: "palnt 2" + i, selected: false}]; 
        instance(aa); // assign data to instance 
      },2000); 
      i++; 
     } 
    return true;  
    }; 
    return self; 
}; 

काम कर नमूना here

+0

डेटा ड्रॉपडाउन में बहुत अजीब उत्पन्न करता है .. –

+0

यह काम नहीं करेगा, क्योंकि मेरे पास फ़ंक्शन प्राप्त करने के अंदर एक अजाक्स कॉल है। सेटटाइमआउट (फ़ंक्शन() { self.options [name] (aa); }, 2000); कृपया सेटटाइम आउट फ़ंक्शन के साथ जांचें। –

+0

अद्यतन पहेली [http://jsfiddle.net/kspxa8as/4/](http://jsfiddle.net/kspxa8as/4/) –

1

मैं एक वादा पुस्तकालय के उपयोग के नए आइटम के अतुल्यकालिक अजाक्स भार संभाल करने की सलाह देते हैं। मैंने नीचे दिए गए नमूने में jQuery के कार्यान्वयन का उपयोग किया है। ध्यान दें कि optionsProvider को अब व्यूमोडेल पर निर्भरता की आवश्यकता नहीं है।

var optionsProvider = function (name, initialValue) { 
    return function() { 
     return $.get("/target/url", {parameter: "value"}) 
     .fail(function() { 
      console.log("request to get new items failed", arguments); 
     }); 
    }; 
}; 

var ViewModel = function() { 
    var self = this, 
     k = 1, 
     ob = optionsProvider("name" + k, ''); 

    self.PlantSelected = ko.observableArray([]); 
    self.fillNewSelect = function() { 
     ob().then(function (newData) { 
      var p = self.PlantSelected; 
      p.removeAll(); 
      p.push.apply(p, newData); 
     }); 
    }; 

    // init 
    self.fillNewSelect(); 
}; 
ko.applyBindings(new ViewModel()); 

उल्लेख करने वाला दूसरा परिवर्तन नई वस्तुओं को सरणी में धक्का देने का तरीका है। .push() एक तर्क सूची का समर्थन करता है:

arr.push('a', 'b', 'c') 

आप आइटम आप (उदाहरण के लिए एक JSON परिणाम के लिए) पुश करने के लिए चाहते हैं की एक सरणी है, तो आप .apply() का प्रयोग करेंगे, अन्यथा आप पहले आइटम के रूप में सरणी ही धक्का होगा :

arr.push.apply(arr, ['a', 'b', 'c']); 

नॉकआउट में अवलोकन करने योग्य सरणी एक ही उपयोग का समर्थन करते हैं।

की तुलना करें: http://jsfiddle.net/kspxa8as/6/