1

고려 뭔가 녹아웃 모델을 업데이트하는 더 좋은 방법 :SignalR 허브 클라이언트 방법에서이 같은

add(item); 
delete(item); 
update(item); 
updateVotes(pk, votes); 

PostHub을

get(pk); 
add(item); 
delete(item); 
update(item); 

허브 클라이언트 방법에 대한 PostHub

에 대한

var postHub = $.connection.postHub; 
function Post(post) 
{ 
    function pk() 
    { 
     return self.PostId; 
    } 
    self = this; 
    self.PostId = 0; 
    self.Text = ko.observable(''); 
    self.Comments = ko.observableArray([]); 
    self.Votes = ko.observable(0); 
    self.CommentToEdit = new Comment(); 
    self.NewComment = new Comment(); 
    if(post) 
    { 
     self.PostId = post.PostId || 0; 
     self.Text = ko.observable(post.text) || ko.observable(''); 
     //etc.. 
    } 
} 
var vm = function() 
{ 
    self = this; 
    self.Posts = ko.obervableArray(mappedPosts); 
    self.StandalonePost = new Post(mappedStandalonePost); 
    self.PostToEdit = new Post(); 
    self.NewPost = new Post(); 
} 

허브 서버 방법을 독립 실행 형 모델 및 모델 모음에 대한 클라이언트 메소드를 어떻게 변경합니까? 예를 들어

: VM의

나는 이런 식으로 뭔가를 구현하는 것, 그것은

postHub.client.updateVotes = function(pk, count) 
{ 
     var post = getbyId(self.Posts(), pk) //getById uses ko.arrayFirst on pk() of model 
     post.Votes(count); 
} 

괜찮아요하지만 나는 독립 모델에 대한 다른 구현을해야합니다. 내가 이런 일을 할 수있는 단 하나의 구현 사전의 VM, 을 가지고 있지만, 그렇게 추한 것 : 내가 사용중인 모든 모델을 업데이트 할 수있는 곳

postHub.client.updateVotes = function(pk, count) 
{ 
     var post = getbyId(self.Posts(), pk) //getById uses ko.arrayFirst on pk() of model 

     //check every standalone model 

     if(!post && self.StandalonePost().pk() == pk) 
     { 
     post = self.StandalonePost(); 
     } 

     post.Votes(count); 
} 

어떻게 한 곳을 구현하는 것이? 구현할 수있는 패턴이 있습니까 (& 게시가 마음에 듭니다. 타이프 스크립트도 가능합니다)?

답변

1

SignalR.EventAggregatorProxy라는 라이브러리가 있습니다. MVVM을 염두에두고 설계되었습니다. 서버와 클라이언트 모두에서 SignalR을 래핑합니다. 일단

https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki

그것을 설정하는 방법에 대한 위키를 확인 아주 좋은 보이는 nuget

Install-Package SignalR.EventAggregatorProxy 
+0

를 사용하여 설치 당신은 어떤 모델

ViewModel = function() { signalR.eventAggregator.subscribe(MyApp.Events.MyEvent, this.onMyEvent, this); }; ViewModel.protoype = { onMyEvent: function(e) { //Act on MyEvent } }; 

에서이 작업을 수행 할 수 있습니다 설정! 나는 그것이 어떻게 작동해야하는지 이해하지만, "추악한 부분"을 피할 수있는 방법을 알아낼 수 없다. 대답을 넓히고 나의 사례에서 어떻게 구현하고 구현할 수 있는가를 보여줄 수 있는가? – formatc

+0

한 곳에 모아서는 안됩니다 (질문이 다소 모호합니다). 이벤트 집계를 통해 훌륭한 부분입니다. 특정 유형의 이벤트를 듣고 행동하려는 사람은 다른 모든 청취자와 완전히 분리 될 수 있습니다. 코드를 재사용하려면 뷰 모델 또는 유사한 클래스의 기본 클래스를 가져야합니다. – Anders

관련 문제