2011-08-13 3 views
8

일부 서버 데이터 (ViewBag)에서 녹아웃 관측 가능한 배열을 초기화하는 가장 좋은 방법을 찾고 있어요 배열 내용을 자바 스크립트 형식의 수 싶습니다. 정의했다. 나는 몇 가지 여분의 ViewModel 특정 속성을 가질 수 있고, 기능, 즉녹아웃 JS 자바 스크립트 형식을 사용하여 서버 데이터에서 관찰 가능한 배열을 초기화

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

그러나 나는 또한 내가 그렇게를 사용하고자하는 재료의 JS 유형이 :

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); 
     } 
} 
JS 유형의 요구없이 그냥 사용할 수 있습니다

그리고는 필요한 초기화됩니다 :

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

은 현재 내가 ViewBag 데이터에서 문자열을 구축하고 다음과 같이 초기화으로 그 렌더링 :

@{ 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)]) 

string.Join 비트보다 깨끗한 방법이 있는지 궁금합니다. 나는 그것을 도우미에서 감쌀 수 있었다. 너 뭐하니?

+1

왜 HtmlHelper 확장 방법을 만들지 않습니까? 일반적인 인수를 취하여 인코딩 된 출력을 반환합니다. – Anuj

+0

@Anuj 그래, 내가 생각한 것 ('도우미에서 마무리 할 수있다')은 JS 유형을 나타내는 문자열을 가져야한다. 문제는 JS 생성자 (및 필요한 순서)에서 사용할 속성을 설정할 때 발생합니다. 속성을 가져 오기 위해 일반적인 인수를 반영 할 수 있지만 서버 측 모델 (다른 서버 측 VM을 필요로하지 않음)을 사용하고 JS에 필요하지 않은 다른 속성을 사용하고 싶습니다. 그리고 그것은 여전히 ​​나에게 뭔가를 놓치지 않는 한 생성자 arg 명령의 문제를 남겨 둡니다. –

답변

15

일반적으로 배열을 먼저 serialize 한 다음 뷰 모델에 배치 할 때이를 매핑합니다. 다음과 같이됩니다 :

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); 
    })) 
} 

클라이언트 측에서 약간의 추가 처리가 필요하지만 건물 문자열보다 깨끗한 것처럼 보입니다.

+0

아, 좋아 보인다. 나는 Knockout을 처음 사용하고 utils.arrayMap을 인식하지 못했습니다. 고맙습니다. –

+0

그냥 jQuery지도를 사용할 수 있습니다 ... –

+2

예, ko.utils.arrayMap에 특별한 것은 없습니다. 아주 간단한 코드. jQuery 맵도 똑같이 할 것이다. –

관련 문제