2012-03-04 27 views
7

Tôi có một danh sách các phần đính kèm trên một trang được tạo bằng cách sử dụng cuộc gọi JS $.ajax và Knockout JS.Danh sách làm mới sau khi cuộc gọi ajax với Knockout JS

HTML của tôi trông giống như (điều này được rút gọn lại):

<tbody data-bind="foreach: attachments"> 
    <tr> 
    <td data-bind="text: Filename" /> 
    </tr> 
</tbody> 

Tôi có một chức năng mà được danh sách các file đính kèm mà được trả lại như một phản ứng JSON:

$(function() { 
    getFormAttachments(); 
}); 

function getAttachments() { 
    var request = $.ajax({ 
    type: "GET", 
    datatype: "json", 
    url: "/Attachment/GetAttachments" 
    }); 

    request.done(function (response) { 
    ko.applyBindings(new vm(response)); 
    }); 
} 

xem mô hình của tôi trông giống như:

function vm(response) { 
    this.attachments = ko.observableArray(response); 
}; 

Có nút làm mới mà người dùng có thể nhấp để làm mới danh sách này bởi vì qua file đính kèm thời gian có thể đã được thêm vào/loại bỏ:

$(function() { 
    $("#refresh").on("click", getAttachments); 
}); 

Hình dựng ban đầu của danh sách các file đính kèm là tốt, tuy nhiên khi tôi gọi getAttachments một lần nữa thông qua các nút refresh nhấp danh sách sẽ được thêm vào (trong thực tế mỗi mục là nhân đôi nhiều lần).

Tôi đã tạo một jsFiddle để chứng minh vấn đề này ở đây:

http://jsfiddle.net/CpdbJ/137

Tôi đang làm gì sai?

+0

Kev - bài đăng hay. Tôi vẫn còn một chút bối rối bởi nó. Mới để loại trực tiếp. Tôi gặp sự cố tương tự như chỉ cần tải một ViewModel với dữ liệu AJAX khi tải trang. Tôi chắc rằng tôi đang thiếu một điểm nhỏ nhưng nghiêm trọng. một điều khiến tôi bối rối là một số hướng dẫn hiển thị 'viewmodel' như một đối tượng (ví dụ' var viewmodel = {something: ko.observable()} ') và một số hàm khác như hàm (ví dụ: hàm ViewModel() {this.something = ko.quan sát()} ') - bất kỳ đề xuất nào? –

+0

@ one.beat.consumer - xem câu hỏi tiếp theo của tôi: http://stackoverflow.com/questions/9589419/difference-between-knockout-view-models-declared-as-object-literals-vs-functions - the câu trả lời và các bình luận dưới đây sẽ làm cho mọi việc rõ ràng hơn. Tôi khuyên bạn nên chi tiêu 25 đô la và xem điều này: http://www.pluralsight-training.net/microsoft/Courses/TableOfContents?courseName=knockout-mvvm – Kev

+0

Tôi sẽ xem câu hỏi khác của bạn; cảm ơn bạn. Tôi có một số lượng lớn đăng ký và tôi đã xem nó 2-3 lần ... chúng hầu như không cào xước bề mặt và phần lớn trong số đó cũ là 2.0, chúng đang sử dụng 1,2 hoặc 1,3 beta ... –

Trả lời

10

Đây là một câu đố sửa mẫu của bạn. Vấn đề lớn nhất của bạn là bạn đã gọi 'applyBindings' nhiều lần. Nói chung, bạn sẽ gọi applyBindings khi tải trang và sau đó trang sẽ tương tác với View Model để làm cho Knockout làm mới các phần của trang của bạn.

http://jsfiddle.net/CpdbJ/136

html

<table> 
    <thead> 
     <tr><th>File Name</th></tr> 
    </thead> 
    <tbody data-bind="foreach: attachments"> 
     <tr><td data-bind="text: Filename" /></tr> 
    </tbody> 
</table> 
<button data-bind="click: refresh">Refresh</button> 

javascript

$(function() { 
    var ViewModel = function() { 
    var self = this; 

    self.count = 0; 
    self.getAttachments = function() { 
     var data = [{ Filename: "f"+(self.count*2+1)+".doc" }, 
        { Filename: "f"+(self.count*2+2)+".doc"}]; 
     self.count = self.count + 1; 
     return data; 
    } 

    self.attachments = ko.observableArray(self.getAttachments()); 

    self.refresh = function() { 
     self.attachments(self.getAttachments());   
    } 
    }; 

    ko.applyBindings(new ViewModel()); 
}); 

-

Bạn cũng có thể muốn xem xét các plugin mapping - http://knockoutjs.com/documentation/plugins-mapping.html. Nó có thể giúp bạn chuyển đổi JSON thành dạng xem. Ngoài ra, nó có thể gán một thuộc tính làm "khóa" cho một đối tượng ... điều này sẽ được sử dụng để xác định các đối tượng cũ và mới trên ánh xạ tiếp theo.

Đây là một fiddle tôi đã viết một thời gian trở lại để chứng minh một ý tưởng tương tự:

http://jsfiddle.net/wgZ59/276

Chú ý: Tôi sử dụng 'cập nhật' như là một phần của quy tắc ánh xạ của tôi, nhưng chỉ để tôi có thể đăng nhập vào giao diện điều khiển. Bạn chỉ cần thêm điều này nếu bạn muốn tùy chỉnh cách các đối tượng cập nhật plugin ánh xạ.

+0

Làm thế nào để nó hoạt động nếu nói rằng tôi không có dữ liệu, và tôi cần gọi một phương thức Ajax và GET của nó? – Vyache

+0

Chỉ cần thay đổi cuộc gọi getAttachments để thực hiện cuộc gọi AJAX và trong cuộc gọi lại, đặt kết quả trực tiếp vào mảng quan sát được. Làm mới sẽ chỉ gọi self.getAttachments(). file đính kèm sẽ được khởi tạo rỗng, và sau đó bạn có thể gọi self.getAttachments() ngay lập tức để thực hiện cuộc gọi AJAX đầu tiên. Một khi các cuộc gọi lại đặt kết quả Knockout sẽ đảm bảo làm mới giao diện người dùng của bạn. –

+0

Hmm, vì một số lý do tôi không thể làm mới dữ liệu của mình bằng phương pháp này, hãy xem câu hỏi của tôi: http://stackoverflow.com/questions/21558075/how-do-i-update-my-model-using-ajax-and -mapping-plugin – Vyache

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