2014-04-22 2 views
4

현재 내 문제에 대한 해결책을 찾고 있습니다. ASP.NET MVC 애플리케이션에는 산업용 장치의 실시간 데이터 시각화에 사용되는 페이지가 있습니다. 페이지가로드되면 데이터베이스의 모든 데이터 포인트에 대한 현재 값으로 뷰 모델 데이터를 가져 오는 동안로드 아이콘이 표시됩니다. 그건 꽤 잘 작동하지만 정적으로, 그 값은 페이지에서로드가 완료되면 변경되지 않는 것을 의미합니다. 웹 응용 프로그램 자체는 장치의 값이있는 메시지를받는 TCP 수신기를 사용합니다. 이러한 메시지 (기본적으로 장치 ID, 데이터 포인트 ID 및 값으로 구성됨)는 일정 간격으로 도착하지 않지만 이벤트 기반으로 도착합니다 (예 : 온도 값이 0.5K 위 또는 아래로 변할 때Knockout ViewModel에 업데이트를 "주입"할 수 있습니까?

내 페이지에는 게이지와 페이지로드시로드되는 초기 데이터의 값을 올바르게 표시하는 다른 많은 요소와 같은 그래픽 위젯이 있습니다. 그들은 녹아웃 뷰 모델에 바인딩됩니다.

문제는 다음과 같습니다. 서버에 새 값이 도착할 때마다 다시로드 할 필요없이 페이지에 표시하려고합니다. 필자는 서버에 도착하는 모든 메시지 (몇 초당 1에서 15)에 수백 개의 데이터 포인트를 가진 전체 뷰 모델을 재전송하고 싶지는 않습니다. 이를 위해, SignalR 프레임 워크를 구현했습니다. 정말 훌륭하게 작동합니다. 이 메커니즘을 사용하여 이제 클라이언트 윈도우에서 새 값을받습니다. 즉, 자바 스크립트로받은 다음 아래에 설명 된 값 객체가 있습니다.

내가 지금 필요한 것은 모든 뷰 모델이 동적으로 구축되기 때문에 모두 다 다릅니다. 개체 및 속성 트리는 두 장치에서 동일하지 않으므로 각각의 개체는 다양한 수준의 하위 개체를 가질 수 있습니다. 실제로는 각 데이터 포인트의 값을 실제로 보유하는 객체의 구조가 동일합니다. 항상 앞서 말한 장치 ID, 데이터 포인트 ID 및 값으로 구성됩니다.

장치 ID와 데이터 포인트 ID가 새롭게 도착한 값 메시지와 일치하는 뷰 모델 내의 값 개체 안에 double -type 값을 업데이트하는 방법이 필요합니다. 또한이 두 주소와 같은 ID와 값으로 구성됩니다.

나는 그 아이디어를 알기를 바랍니다. 이것을 할 수있는 방법이 있습니까? 그러한 메커니즘을위한 가장 좋은 방법은 무엇입니까? 최근에 Knockout-MVC (kMVC nuget 패키지)로 전환했지만, "순수한"Knockout.js로 돌아가서 도움이된다면 몇 가지 추가 스크립팅으로 돌아가겠습니다.

도움과 의견을 보내 주셔서 감사합니다.

+0

나는 당신이 문제를 올바르게 이해하고 있으며, 나는 당신이 계산 된 Observables를 관찰해야한다고 생각한다. 그렇게하면 새로운 가치를받을 수 있습니다. 새 값을 계산 한 다음 데이터를 삭제해야합니다. 그렇지 않으면 결국 메모리가 부족합니다. http://knockoutjs.com/documentation/computedObservables.html – n4gy3

+4

일부 샘플 코드가 유용합니다 –

+0

키/값이있는 배열을 만들고 키를 가져 와서 값을 반환하는 함수에 데이터를 바인딩 할 수 있습니다. 데이터 포인트를 업데이트 할 때 배열의 키/값을 업데이트해야합니다. –

답변

1

http://nthdegree.azurewebsites.net/mvvm-2/

여기에 일반적인 생각은 당신이 당신의 모델을로드 뷰 모델 코드를 가지고 있어야한다는 것이다 Knockout mapping plugin

에 말하기 기사입니다.

아약스 호출로 서버에서로드하는 속성을 가진 뷰 모델을 바인딩 할 수 있습니다 (기사 하단 참조). DOM 요소에 연결하면

그런 다음 바로

ko.mapping.fromJS(newData, mapping, modelToUpdate) 


var mapping = {}; //define your mapping (see documentation or blog post) 

function ViewModel(){ 
    var self = this; 

    self.model = ko.mapping.fromJS({}, mapping); 
    self.hub = $.connection.myHub(); 
    self.hub.client.updateModel = function(data){ 
     ko.mapping.fromJS(data, mapping, self.model); 
    }; 
    self.hub.start().done(function(){ 
     //you could either make a call or have the "OnConnected" method trigger an 'updateModel' 
    }); 
} 
1

뷰 모델의 속성과 결과에 모델을 업데이트하는 것은 실제로 KO 관찰 배열에있는 데이터를 업데이트하고 편집 할 수 있습니다. 일관성있는 ID를 사용하여 "그래픽 위젯"의 값을 변경할 수 있습니까 (높이와 너비를 유지하기 위해 일부 속성을 사용한다고 가정)?

테스트하지 않았습니다. 다른 옵션은 KO foreach 루프를 사용하고 관련 값을 업데이트하는 것입니다.

관련 문제