2011-09-15 21 views
7

Hãy xem xét đoạn mã ViewModel sau:Các applyBindings() là quá nhanh, gọi trước khi yêu cầu Ajax hoàn

var id, given1, given2; 

$.get("testSynUfGet.aspx", null, function (data) { 
    id = data.id; 
    given1 = data.given1; 
    given2 = data.given2; 
}, 'json'); 
//alert('here'); 
ko.applyBindings(new viewModel(id, given1, given2)); 

Dường như cuộc gọi ajax của tôi thông qua $.get là quá chậm hoặc ko.applyBindings() là quá nhanh. Dù bằng cách nào, có vẻ như loại trực tiếp đó chỉ có thể ràng buộc đúng nếu tôi bỏ ghi chú dòng alert('here');.

Nếu tôi để lại nhận xét, không có điều khiển nào được điền.

Mọi ý tưởng, mọi người?

Công việc duy nhất xung quanh tôi có thể nghĩ ra là để làm .applyBindings như là một phần của hàm callback trong $.get như thế này:

$.get("testSynUfGet.aspx", null, function (data) { 
    ko.applyBindings(new viewModel(data.id, data.given1, data.given2)); 
}, 'json'); 
+0

Cả hai câu trả lời đều hợp lệ, tùy thuộc vào những gì bạn đang cố gắng đạt được. –

+0

Chỉ muốn xem lại điều này, tôi tin rằng cách suy nghĩ đầu tiên của tôi vẫn còn trong lĩnh vực lập trình đồng bộ. Chính xác là thứ hai - làm cho việc ràng buộc trở thành một phần của quá trình không đồng bộ. –

Trả lời

15

workaround của bạn là cách chính xác để làm việc. Đây là trình xử lý 'thành công' của bạn được gọi khi dữ liệu được trả về và đó là điểm chính xác để sau đó điền vào mô hình khung nhìn của bạn và áp dụng các ràng buộc.

+1

cảm ơn Mark, - Tôi đang đánh dấu câu trả lời này là câu trả lời trong thời gian này (tôi khá mới trong loại trực tiếp). –

+0

Tôi đã có một vấn đề tương tự, mặc dù tôi đã có dữ liệu của tôi ràng buộc với mô hình một cách chính xác, tôi đã có một số điều khiển giao diện người dùng của tôi không ràng buộc đúng trong mẫu của tôi. (Việc kiểm soát accordion đã được làm việc, nhưng datepickers bên trong accordion không được) Giải pháp là để di chuyển mã mà đặt datepickers của tôi, vv vào một chức năng được gọi là sau khi 'thành công' của tôi. Một cái gì đó khác để giữ một mắt ra cho. Dấu +1, câu trả lời của bạn đã chỉ cho tôi đúng hướng. –

+1

Đây là câu trả lời đúng - nhưng tôi nghĩ tôi sẽ thêm lý do tại sao ... - cuộc gọi $ .ajax là không đồng bộ, vì vậy nó đi thẳng đến dòng tiếp theo - áp dụng các ràng buộc. Bằng cách đặt nó trong hàm gọi lại, nó được gọi là * sau khi quá trình không đồng bộ hoàn tất. Cách tốt nhất để làm điều đó là đặt nó vào trình xử lý .success() để nó chỉ thực hiện nếu nó hoàn thành thành công. –

8

Cách giải quyết này sẽ chỉ hoạt động miễn là bạn chỉ có một cuộc gọi ajax trên trang. Tôi nghĩ rằng các giải pháp đúng là để tạo ra viewmodel của bạn đầu tiên, với id, given1, và given2 là quan sát (bắt đầu rỗng). Và sau đó trong cuộc gọi lại ajax, bạn thay đổi giá trị của những quan sát đó.

0

Cách đúng hơn là thực hiện cuộc gọi ajax của bạn bên trong đối tượng viewmodel và điền thuộc tính của mình.

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