2012-06-02 4 views
11

Tôi hiện đang làm việc trên một giải pháp ASP.NET MVC và gần đây đã giới thiệu cả Knockout (thư viện JS MVVM) và Wijmo (một bộ tiện ích jQuery UI).Làm thế nào tôi có thể tạo các mô hình xem phía máy khách để loại bỏ trong một dự án ASP.NET MVC?

Với việc giới thiệu Knockout tôi cũng cần phải có các mô hình ở phía máy khách, vì vậy cho mục đích này tôi đang sắp xếp hàng loạt C# ViewModel và gắn nó vào khung nhìn bằng cách sử dụng data-model="@Model.ToJson()". Điều này cho phép tôi lấy lại mô hình từ JS và áp dụng một số tình yêu phía khách hàng cho tất cả mọi thứ.

Tuy nhiên, loại trực tiếp cần mọi thứ để quan sát được, vì vậy tôi cần khai báo một ViewModel phía máy khách riêng biệt và ánh xạ mọi thứ từ đối tượng mô hình dữ liệu. Điều này cảm thấy rất giống như nỗ lực trùng lặp và tôi muốn tránh nó bằng cách nào đó.

Tôi hy vọng ai đó có công cụ hoặc kỹ thuật để chia sẻ điều đó sẽ cho phép tôi hiển thị trực tiếp Chế độ xem trực tiếp từ máy chủ. Giải pháp có thể có thể bao gồm:

  • Nối tiếp JSON tùy chỉnh để hiển thị mô hình chế độ xem quan sát trực tiếp đến đầu ra trong thuộc tính mô hình dữ liệu.
  • Tự động chuyển đổi phía máy khách (tôi đã nghe nói về không tự động, nhưng không chắc chắn nếu đó là một đường dẫn được khuyến nghị để thực hiện hoặc ổn định/hoàn thành)
  • Điều tôi chưa từng nghĩ đến

Tôi muốn giải pháp là chung chung và tự động, vì cách tiếp cận hiện tại của tôi về cách nhập các mô hình xem phía máy khách quan sát bằng tay chỉ là không hiệu quả để có thể thực hiện được.

Bạn giải quyết vấn đề này như thế nào?

Trả lời

10

Theo hướng dẫn của họ nó chỉ là một đơn giản .map chức năng

Nếu đây là ViewModel

function Task(data) { 
    this.title = ko.observable(data.title); 
    this.isDone = ko.observable(data.isDone); 
} 

Và chức năng get này là dữ liệu từ máy chủ, nó sử dụng .map chức năng để bơm dữ liệu máy chủ ngay vào máy ảo

// Data 
var self = this; 
self.tasks = ko.observableArray([]); 

// Load initial state from server, convert it to Task instances, then populate self.tasks 
$.getJSON("/tasks", function(allData) { 
    var mappedTasks = $.map(allData, function(item) { 
     return new Task(item) 
    }); 
    self.tasks(mappedTasks); 
}); 

Đối với bản đồ ko http://knockoutjs.com/documentation/plugins-mapping.html

Đối với tính năng tự động ràng buộc ở đây là một ví dụ

https://groups.google.com/forum/#!msg/knockoutjs/IJTx37UXQVw/UTrWdEK1C-oJ

+0

Đó là khá nhiều những gì tôi đã làm, như bạn cần một chức năng nhiệm vụ cho mỗi xem mô hình. Các giải pháp tôi đang tìm kiếm không nên yêu cầu tôi phải có một phương pháp hoặc lớp học cho mỗi mô hình xem, nhưng thay vì có một mảnh chia sẻ mã duy nhất để làm việc chuyển đổi (hoặc khách hàng hoặc phía máy chủ). Đúng nếu tôi nhầm. –

+0

Đó là nơi bạn muốn autobind Tôi tin rằng nó được gọi là, hoặc có nếu không bạn cần phải có một cho mỗi :-( –

+0

Có autobind làm việc? Nó được cập nhật lần cuối 7 tháng trước và readme nói "Đây là cam kết intial và hỗ trợ chỉ tên phần tử ràng buộc để xem mô hình "và điều này dường như ngụ ý rằng nội dung bị thiếu hoặc một số trường hợp không hoạt động, mà không rõ ràng về nó.Ngoài ra, jsfiddle mà tác giả được liên kết trong một bài đăng khác đã bị hỏng, vì vậy có thể sử dụng ví dụ nếu đó là đề xuất của bạn;) –