2011-09-05 2 views
5

나는 녹아웃 JS를 처음 사용하지만 매일 배우는 모든 것을 즐기고 있습니다.KnockoutJS 및 MVC 3.0이 포함 된 중첩 템플릿

여기 내 질문입니다. 각, 내 색인()는 HomeController의 방법은 ParentModel의 목록을 MasterModel의 인스턴스를 반환

public class MasterModel 
{ 
    public int Id { get; set; } 
    public string Description { get; set; } 
    public ICollection<ParentModel> Parents { get; set; } 
} 

public class ParentModel 
{ 
    public int Id { get; set; } 
    public string Description { get; set; } 
    public ICollection<ChildModel> Children { get; set; } 
} 

public class ChildModel 
{ 
    public int Id { get; set; } 
    public string Description { get; set; } 
} 

그리고 그 다음 Loading and saving data 튜토리얼을 바탕으로, 이제 내가 MVC 3.0 뷰 모델에서 다음과 같은 클래스가 있다고 가정 해 봅시다 차례로 ChildModel의리스트가 포함됩니다. 나는 MasterModel에 각 ParentModel, ChildrenModel 목록 행 ParentModel의 목록을 표시 할 중첩 된 템플릿을 사용할 수 있도록하고 싶습니다

@model SomeNamespace.Models.MasterModel 

(...) 

<script type="text/javascript"> 
    var initialData = @Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model)); 
    var viewModel = { 
     parents: ko.observableArray(initialData.Parents), 
    (...) 
    }; 

: 클라이언트 측에, 나는 다음 볼 수 있습니다. 또한 두 목록 (ParentModel 및 ChildrenModel)을 관찰 가능 배열로 지정하여 각 목록의 항목을 동적으로 추가하거나 제거 할 수 있습니다.

에게 는

나는이가 넉 아웃 JS 사이트의 "template" binding 기사를 다음의 구현을 시도하지만,의 ... 관찰 배열 목록을 포함 관찰 배열을 구현하는 방법을 잘 생각해야 ...

는 누군가가 날 포인트 올바른 방향으로?

미리 감사드립니다.

답변

7

jsFiddle example하는 방법에 당신을 도울 수 있어야합니다, 그것은 다음과 같이 작동

<ul data-bind="template: {name: 'TopTemplate' , foreach: masters}"></ul> 
<script type="text/html" id="TopTemplate"> 
    <li >  
     <p>${name}</p> 
     <ul data-bind=" template: {name: 'NestedTemplate' , foreach: parents } " style="list-style-type:circle;margin-left:15px"> 
     </ul> 
    </li> 

</script> 
<script type="text/html" id="NestedTemplate">   
    <li> 
     <p>${name}</p> 
     <ul data-bind=" template: {name: 'parentTemplate' , foreach: children } " style="list-style-type:circle;margin-left:15px"> 
     </ul> 
    </li> 
</script> 
<script type="text/html" id="parentTemplate">   
    <li> 
     <p>${name}</p> 
    </li> 
</script> 

그리고이 코드 :

var viewModel = { 
    masters: ko.observableArray([ 
     { 
     name: "Master1", 
     parents: [{ 
      name: "Parent 1", 
      children : [{ 
       name: "chlid 1"}, 
      { 
       name: "child 2"}]}, 
     { 
      name: "Parent 2", 
      children : [{ 
       name: "chlid 1"}, 
      { 
       name: "child 2"}]}]}, 
    { 
     name: "Master2", 
     parents: [{ 
      name: "Parent 3", 
      children : [{ 
       name: "chlid 1"}, 
      { 
       name: "child 2"}]}, 
     { 
      name: "Parent 4", 
      children : [{ 
       name: "chlid 1"}, 
      { 
       name: "child 2"}]}]}  ]) 
}; 

// ko magic... 
ko.applyBindings(viewModel); 
+0

안녕하세요,이 갈 방법은 확실히이지만,에서 내 예제, 내 ** initialData ** 변수를 주인, 부모 및 자녀에게 어떻게 변환하겠습니까? 내 문제는이 시점에서 녹아웃보다 더 자바 스크립트에 관련이있을 것 같아요 ... :-) – Talisker

+0

** initialData ** 거의 비슷하게 보일 것입니다. 저는 Json 구조를'@IEnumerable '가정하에 조롱했습니다. 실수였습니다. '@model SomeNamespace.Models.MasterModel'을 사용하면 json이 배열이 아니라 3 개의 속성 (Id, Description 및 Parents라는 배열)을 포함하는 하나의 Master 객체가됩니다. 또한 내가 준 예제에서는 마스터 배열 만 관찰 했으므로 UI는 해당 배열의 변경 (마스터 객체의 푸시/팝 등)에 반응합니다. Look in this : [매핑] (http://knockoutjs.com/documentation/plugins-mapping.html) –

+0

매핑 플러그인은 정확히 내가 필요로하는 것입니다. 많은 감사합니다! – Talisker

관련 문제