2013-04-11 1 views
1

이 질문은 코드를 구조화하는 방법 또는 좀 더 정확하게 Knockout을 사용하여 MVVM 패턴에서 모델의 책임을 수행하는 방법과 관련이 있습니다. Durandal과 함께 Knockout을 사용하고 있지만 질문은 MVVM 패턴의 일반적인 질문 일 수 있습니다. 예를 들어MVVM 모델의 책임

를 들어 내가 같은 모델을 가지고 :

var Model = function(data){ 
     this.name = data.name; 
     this.count = ko.observable(); 
}; 

Model.prototype.getCount = function(){ 
     var self = this; 
     setInterval(function(){ 
      //some ajax call to get the count 
      self.count(data.count); 
     }, 1000); 

}; 

내 뷰 모델처럼 내 모델의 컬렉션을 취 지금

var ViewModel = function(){ 
     this.models = ko.observableArray([]); 
     //ajax call to get the required data 
     data.Items.forEach(function(item){ 
      var model = new Model(item);  
      model.getCount(); 
      this.models.push(model); 
     } 
}; 

그리고 내보기

<div data-bind="foreach: models"> 
    <div data-bind="text: name"></div> 
    <div data-bind="text: count"></div> 
</div> 

내 질문은 내 모델에는 관찰 가능한 속성이 있고 속성이 변경 될 때마다 뷰가 업데이트됩니다. 그러나 본질적으로 이는 모델이며 UI를 뷰 모델에만 의존하여 업데이트해야합니다.

따라서 카운트를 업데이트하는 것과 관련된 코드는 기본적으로 getCount이며보기 모델에 게시되며 해당 모델이 적합하지 않습니다. viewModel 또는 모델에서 어떤 코드를 유지해야하는지에 대한 구분은 어디에 있습니까?

+3

모델은 시스템의 엔티티를 나타내지 만 ViewModel은 UI의 모델입니다. 모델은 자체를 업데이트하기 위해 지속성/백엔드와 상호 작용해야합니다. ViewModel은 모델과 UI (2 가지 방법) 사이를 연결합니다. 백 모델 ViewModel <->보기 –

+0

위의 사례에서 사용한 내 모델은 백엔드와 상호 작용하여 카운트 값을 업데이트하고 뷰에 양방향 바인딩이있는 관찰 가능한 속성을가집니다. 그러나 독서 후에는 아래 답변을 viewModel로 생각하는 경향이 더 큽니다. 내가 틀렸다면 나를 바로 잡아주세요. UI 바인딩의 경우 – nimgrg

+1

이면 Model과 ViewModel은 모두 ViewModel입니다. 그러나 모델은 도메인 모델입니다. ViewModel은 UI에만 국한된 반면, ViewModel은 User, Product 등입니다. –

답변

2

솔직히 말해 모델을 뷰 모델로 분류 할 것입니다. 모델은 Ajax 호출에서 얻은 json 객체이며, 각각에 대한 뷰 모델을 생성한다. 내가 생각하는 한 중첩 된 뷰 모델은 문제가되지 않습니다.

+0

나는 전체 컨셉에 대해 약간의 생각을하고 답을 더하기 만하면 다른 사람들과 함께 생각해 보았습니다. 제가 가지고 있었던 의심과 혼란을 해결하는 데 도움이되었습니다. 감사!! – nimgrg

1

넉 아웃은 MVVM을 실제로 구현하지 않습니다. 그것은 VVM과 더 비슷합니다. 백본 (Backbone) 등의 다른 라이브러리는 모델을 사용합니다. 녹아웃은 실제로하지 않습니다. Knockout의 MVVM을위한 "모델"은 서버 측 데이터베이스 엔터티입니다.

+0

서버 측 엔티티가 모델이지만, 더 많은 속성 (계산 된 등)으로 엔티티를 꾸밀 수 있습니다. 뷰 모델은 본질적으로 해당 모델과 뷰 사이의 다리 역할을하므로 뷰에 대한 작업은 뷰 모델에 의해 처리되며 기본 모델을 변경해야합니다. 따라서 ViewModel은 모델을 포함하고 있으며 뷰에서 사용할 수 있도록하는 모델입니다. 따라서, Mode-View-ViewModel. 동의하니? –

+0

나는 당신이 진정한 모델보다 더 많은 전환을보고 있다고 생각한다. 모델을 뷰에 전달하고 "장식"을하거나, 심지어 모델을 수정하지 않더라도 (홀수 일지라도) 여전히 모델이 아닌 "뷰 모델"입니다. 뷰 모델을 인스턴스화 할 때 간단히 클라이언트 측에 존재한다는 논쟁을 제기 할 수는 있지만 나중에는 거의 버려집니다. 모델을 업데이트하려면 AJAX POST를 사용하여 클라이언트 쪽 버전이 아닌 서버 쪽 엔터티를 수정해야합니다. –

+0

올바르게 입력하십시오. 나는 거기에 동의한다. –