2012-12-12 36 views
6

मेरे पास पृष्ठ पर एक ग्रिड और एक चयन नियंत्रण है। किसी भी चयन मूल्य का चयन ग्रिड अद्यतन ट्रिगर्स। यह अद्यतन गणना का उपयोग कर किया जाता है। क्या मैं ग्रिड में एक नया मान जोड़ा जाता है, स्थिति में अद्यतन करने के लिए मैन्युअल रूप से ग्रिड ट्रिगर कर सकता हूं?Knockout.js: मैन्युअल रूप से गणना

function vm(){ 
    var self = this; 

    self.items = ko.observableArray([]); 
    self.chosen_category = ko.observable(""); 

    self.pager = { 
     page_namber : ko.observable(1), 
     page_size : ko.observable(10) 
    }; 

    self.sort = { 
     field : ko.observable('name'), 
     dist : ko.observable('asc') 
    }; 
    // etc. 

    self.fetch = ko.computed(function(){ 
     $.ajax({ 
       url: '/api/items/', 
       type: 'GET', 
       data: ko.toJSON(self), 
       contentType: 'application/json', 
       success: self.items 
      }); 
    }, self); 


     self.add_item = function() { 
     //here I want to update the grid 
     self.fetch(); // not work 
     }; 
} 

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

काम कर संस्करण:

  function vm() { 
      var self = this; 

      self.items = ko.observableArray([]); 
      self.chosen_category = ko.observable("test"); 

      self.pager = { 
       page: ko.observable(1), 
       size: ko.observable(10) 
      }; 

      self.sort = { 
       field: ko.observable('name'), 
       dist: ko.observable('asc') 
      }; 

      self.fetch = function() { 
       var data = { 
        category: self.chosen_category(), 
        pager: ko.toJS(self.pager), 
        sort: ko.toJS(self.sort) 
       }; 

       $.ajax({ 
        url: '/api/items/', 
        type: 'POST', 
        data: ko.toJSON(data), 
        contentType: 'application/json', 
        success: self.items 
       }); 
      }; 

      self._auto_update = ko.computed(self.fetch).extend({ throttle: 1 }); ; 

      self.add_item = function() { 
       self.fetch(); 
      }; 
     } 
+1

आप इसे मैन्युअल रूप से अद्यतन करने की आवश्यकता न:

function vm(){ var self = this; self.items = ko.observableArray([]); self.chosen_category = ko.observable(""); self.fetch = function(){ $.get('/api/items/' + self.chosen_category(), self.items); }; self.chosen_category.subscribe(self.fetch); self.add_item = function() { //here I want to update the grid self.fetch(); }; } 

इसके अलावा, आप अभिकलन साथ भी ऐसा ही कर सकते हैं: उस मामले में आप दोनों सदस्यता और मैनुअल कॉल के लिए उपयोग करने के लिए समारोह लाने परिभाषित कर सकते हैं observableArray। लेकिन मुझे यकीन नहीं है कि आप गणना किए गए अवलोकनों का उपयोग कर रहे हैं – Anders

+0

मुझे लगता है कि नॉकऑट का विचार यह है कि आप चीजों को देखने योग्य बनाते हैं, इसे स्वयं ट्रिगर नहीं करते हैं। संग्रह के परिवर्तन से fetch विधि स्वचालित रूप से लागू किया जाना चाहिए। मैं खोज रहा हूं कि, क्या आपके पास एक और पूर्ण उदाहरण है? – EricG

उत्तर

9

यह subscription बजाय computed के साथ ऐसा करना बेहतर है। के बाद से आइटम एक है

function vm(){ 
    var self = this; 

    self.items = ko.observableArray([]); 
    self.chosen_category = ko.observable(""); 

    self.fetch = function(){ 
    $.get('/api/items/' + self.chosen_category(), self.items); 
    }; 

    self.doStaff = ko.computed(self.fetch); 


    self.add_item = function() { 
    //here I want to update the grid 
    self.fetch(); 
    }; 
} 
+0

हां यह समाधान काम करता है, लेकिन अगर मैं भविष्य में अधिक क्षेत्रों में थर्म सर्वर को भेजने के लिए जा रहा हूं तो मुझे उनमें से प्रत्येक के लिए सदस्यता लेनी होगी। –

+0

आप गणना के साथ ऐसा ही कर सकते हैं, उस स्थिति में कोई स्वचालित रूप से फ़ंक्शन में उपयोग किए जाने वाले सभी अवलोकनों की सदस्यता लेगा। –

+0

@AndrewLuzkovky मैं इस स्पष्ट रूप से ऐसा करने का सुझाव दूंगा और गणना के माध्यम से नहीं। इसके अलावा मुझे लगता है कि वीएम को अनुरोध के रूप में भेजने का सबसे अच्छा विचार नहीं है - आपको वास्तव में क्वेरी को समाहित करने के लिए कुछ अन्य वस्तु होनी चाहिए। इसके अलावा, आरईएसटी सेवा से JSON arrays को वापस सुरक्षित नहीं है: http://incompleteness.me/blog/2007/03/05/json-is-not-as-safe-as- लोग-think-it-is/ – Stefan

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