2012-12-12 59 views
6

Tôi có lưới và điều khiển chọn trên trang. Chọn bất kỳ giá trị lựa chọn nào kích hoạt cập nhật lưới. Việc cập nhật đó được thực hiện bằng tính toán. Tôi có thể kích hoạt lưới theo cách thủ công để cập nhật, ví dụ: trong trường hợp giá trị mới được thêm vào lưới không?Knockout.js: kích hoạt theo cách thủ công được tính

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 
     }; 
} 

Chắc chắn tôi có thể chuyển sang chức năng riêng nhưng tôi đang tìm giải pháp sạch hơn. Cảm ơn!

phiên bản làm việc:

  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

Bạn không cần phải cập nhật nó bằng tay từ các mặt hàng là một observableArray. Nhưng tôi không chắc chắn tôi thích cách bạn đang sử dụng các quan sát tính toán – Anders

+0

Tôi nghĩ ý tưởng của KnockOut là bạn làm cho mọi thứ có thể quan sát được, chứ không phải tự kích hoạt nó. Phương thức tìm nạp sẽ tự động được gọi bằng cách thay đổi bộ sưu tập. Tôi đang tìm kiếm như thế nào, bạn có một ví dụ hoàn chỉnh hơn? – EricG

Trả lời

9

Nó là tốt hơn để làm điều này với subscription thay vì computed. Trong trường hợp đó, bạn có thể xác định lấy chức năng để sử dụng cho cả thuê bao và bằng tay gọi:

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(); 
    }; 
} 

Bạn cũng có thể làm tương tự với tính:

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

Có giải pháp này hoạt động, nhưng nếu tôi sẽ có nhiều lĩnh vực trong tương lai để gửi đến máy chủ therI phải thêm đăng ký cho mỗi người trong số họ. –

+0

Bạn có thể làm tương tự với tính toán, trong trường hợp đó ko sẽ tự động đăng ký tất cả các quan sát được sử dụng trong một hàm. –

+0

@AndrewLuzkovky Tôi sẽ đề xuất thực hiện điều này một cách rõ ràng và không được tính toán. Ngoài ra tôi nghĩ rằng đó không phải là ý tưởng tốt nhất để gửi vm như yêu cầu - bạn thực sự nên có một số đối tượng khác để đóng gói truy vấn. Hơn nữa, trả về các mảng JSON từ dịch vụ REST không an toàn: http://incompleteness.me/blog/2007/03/05/json-is-not-as-safe-as-people-think-it-is/ – Stefan

Các vấn đề liên quan