2012-10-31 40 views
6

Tôi biết thực tế là bạn có thể tạo các liên kết 2 chiều trong knockout.js. Điều này thay đổi mô hình trong javascript khi bạn thay đổi chế độ xem và đối diện. Tôi cần một cách để thông báo và gửi các thay đổi này trở lại máy chủ. Vì vậy, tôi khá nhiều cần phải làm một bài đăng đến máy chủ. Tôi có thể làm cái này như thế nào?Knockout.js đăng lại máy chủ để cập nhật mô hình

Ý tôi là, bằng cách nào đó tôi cần đính kèm trình xử lý sự kiện để bất cứ khi nào tôi thay đổi một lần các mô hình của mình, nó sẽ tự động đăng lại máy chủ các thay đổi.

Trả lời

14
function MyViewModel() { 
    var self = this; 
    self.value1 = ko.observable(); 
    self.value2 = ko.observable(); 
    ko.computed(function() { 
     $.ajax({ 
      url: '/path/to/server/endpoint', 
      type: 'POST', 
      data: { 
       value1: self.value1(), 
       value2: self.value2() 
      } 
     }); 
    }); 
} 

Bạn không nên cần "đăng ký nhãn hiệu" riêng cho mỗi tài sản viewmodel. Chỉ cần xác định ko.computed. Tất cả ko.computed s được tự động thông báo về những thay đổi đối với các quan sát mà chúng phụ thuộc vào. Trong đoạn mã trên, tính toán phụ thuộc vào các giá trị quan sát giá trị 1 và giá trị 2 (trong đối số data đối với hàm jQuery $.ajax). Bất cứ khi nào giá trị của một thay đổi quan sát được, hàm ko.computed được gói sẽ thực thi và gửi (các) giá trị mới đến máy chủ.

+0

Tác phẩm này - gần như. Dường như đăng ngay khi trang tải lần đầu tiên. Bất kỳ cách nào để ngăn chặn điều đó xảy ra lần đầu tiên? – Shadow

+0

Tôi tìm thấy một cách xung quanh tải đầu tiên. 'function MyViewModel() {self.firstload = true; ko.computed (function {self.value1(); if (firstload) trả về firstload = false; $. Post ("/path/to/endpoint ", {data: self.value1();});}}} '(sử dụng http://jsbeautifier.org/: P) – Shadow

0

tôi làm điều đó thông qua json (chỉ có một chiều):

tải ko bạn ràng buộc từ json String (ví dụ):

userSettingsModel = ko.mapping.fromJSON('${userSettingsJSON}'); 
    ko.applyBindings(userSettingsModel); 

Gửi ko Object thay đổi lại cho máy chủ (ví dụ):

function saveConferencesFilter() { 
    // console.log(ko.mapping.toJSON(userSettingsModel)); 
    $.ajax({ 
     type: 'PUT', 
     url: '/AudioPlace/userSettings/rest', 
     dataType: 'json', 
     contentType: 'application/json;charset=UTF-8', 
     data: ko.mapping.toJSON(userSettingsModel), 
     success: function (data) { 
      getConferences(); 
     } 
    }); 
} 
+0

Vâng, tôi xin lỗi vì đã xây dựng điều này không chính xác nhưng tôi cần tự động gửi các thay đổi trở lại máy chủ mà không có người dùng cuối thực hiện bất kỳ điều gì khác ngoài thay đổi chế độ xem. Tôi chỉ cần một cách để thêm một số mã tùy chỉnh khi một thuộc tính đã được thay đổi trong mô hình của tôi. – Alecu

+0

nó ổn. Tôi đã đoán viết câu trả lời nó có thể không phải của bạn đang tìm kiếm. Nhưng câu trả lời được đánh dấu là mục tiêu. – derlinuxer

1

Làm thế nào về một manual subscription?

  • đăng ký bằng tay có thể được coi như các ràng buộc đối với mô hình quan điểm của bạn. Các ràng buộc cho phép giao diện người dùng của bạn phản ứng với các thay đổi trong mô hình chế độ xem của bạn, trong khi các đăng ký thủ công cho phép mô hình khung nhìn của bạn phản ứng với các thay đổi của chính nó. Điều này có thể có nghĩa là thực hiện cập nhật cho các đối tượng liên quan khác trong mô hình khung nhìn của bạn.

  • Ví dụ phổ biến là kích hoạt cập nhật cho một quan sát qua AJAX khi một thay đổi quan sát khác, chẳng hạn như khi hộp kiểm được chọn hoặc giá trị thả xuống được thay đổi. Trong trường hợp này, đăng ký thủ công hoạt động như một tính toán không đồng bộ được tính toán.

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