2011-08-13 30 views
8

Tôi đang tìm cách tốt nhất để khởi tạo mảng có thể quan sát được từ một số dữ liệu máy chủ (ViewBag), và tôi muốn nội dung của mảng là loại javascript đã xác định. Nếu không có yêu cầu của các loại JS Tôi chỉ có thể sử dụng:Knockout JS khởi tạo mảng quan sát được từ dữ liệu máy chủ bằng cách sử dụng một loại javascript

materialVarieties: ko.observableArray(@Html.Raw(Json.Encode(ViewBag.Materials))) 

nhưng tôi cũng có một loại nguyên liệu JS mà tôi muốn sử dụng để tôi có thể có một số đặc tính thêm ViewModel cụ thể và chức năng tức là:

var material = function(id, name) { 
    this.id = id; 
    this.name = name; 
    this.selected = ko.observable(false); 

    this.select = function() 
    { 
     jQuery.each(processViewModel.materials(), function(index, item) 
     { 
      item.selected(false); 
     }); 
     this.selected(true); 
     } 
} 

và sau đó khởi tạo yêu cầu trở thành:

materialVarieties: ko.observableArray([new material(1, "Apricot"), ..... 

Hiện nay tôi xây dựng một chuỗi từ các dữ liệu ViewBag và sau đó việc này là như initializer như thế này:

@{ var items = string.Join(",", 
       ((IEnumerable<MaterialVariety>) ViewBag.Materials) 
          .Select(m => string.Format("new material({0}, {1})", 
             Json.Encode(m.Id), Json.Encode(m.Name)))); } 

var processViewModel = { 
    material: ko.observableArray([@Html.Raw(items)]) 

Nhưng tôi tự hỏi có cách nào sạch hơn bit string.Join không. Tôi có thể bọc nó trong một người trợ giúp. Bạn làm nghề gì?

+1

Tại sao không tạo phương thức mở rộng HtmlHelper? Tham số chung và trả về kết quả được mã hóa. – Anuj

+0

@Anuj Yeah thats những gì tôi đã suy nghĩ ('Tôi có thể quấn nó lên trong một người trợ giúp'), nó cũng sẽ phải có một chuỗi đại diện cho các loại JS. Sự cố xảy ra khi làm việc các thuộc tính để sử dụng trong hàm tạo JS (và thứ tự bắt buộc). Tôi có thể phản ánh đối số chung để có được các thuộc tính, nhưng tôi đã hy vọng sử dụng các mô hình phía máy chủ của tôi (không muốn một bộ máy chủ phía máy chủ khác) và chúng có các thuộc tính khác mà tôi không cần trong JS của mình. Và điều đó vẫn để lại cho tôi vấn đề về trình tự constructor arg ..... trừ khi tôi đang thiếu cái gì đó? –

Trả lời

15

Tôi thường sẽ sắp xếp dãy đầu tiên, sau đó ánh xạ nó khi đặt nó trong mô hình khung nhìn. Sẽ giống như:

var originalVarieties = @Html.Raw(Json.Encode(ViewBag.Materials)) 

var processViewModel = { 
    materialVarieties: ko.observableArray(ko.utils.arrayMap(originalVarieties, function(variety) { 
     return new material(variety.id, variety.name); 
    })) 
} 

Yêu cầu một lượng nhỏ xử lý bổ sung ở phía máy khách, nhưng có vẻ sạch hơn so với chuỗi xây dựng.

+0

ah, có vẻ tốt. Tôi mới đến Knockout và không biết utils.arrayMap. Cảm ơn bạn. –

+0

chỉ có thể sử dụng bản đồ jQuery cũng như tôi giả sử ... –

+2

vâng, không có gì đặc biệt về ko.utils.arrayMap. Mã đơn giản. Bản đồ jQuery sẽ làm tương tự. –

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