2014-09-01 3 views
0

데이터베이스의 메시지를 표시하는 응용 프로그램이 있습니다. 서버 측 API 컨트롤러에는 Breeze.js를 사용하고 데이터 바인딩에는 Knockout.js를 사용합니다.넉 아웃 뷰 모델 반환 함수 (사용법)

처음에는 30 개의 메시지를 받고 30 초마다 데이터베이스에 삽입 된 최신 메시지를받습니다.

function messageViewModel() { 
    var self = this; 
    var refreshRate = 5000; 
    var lastMessageID = null; 
    self.allMessages = ko.observableArray(); 

    var query = breeze.EntityQuery.from('Messages').orderByDesc('Id').expand('Poster').take(20); 
    manager.executeQuery(query) 
     .then(function(messages) { 
      self.allMessages(messages.results); 
      lastMessageID = messages.results[0].Id(); 
      window.setInterval(refresh, refreshRate); 
     }).fail(function(error) { 
      alert(error.message); 
     }); 

    function refresh() { 
     query = breeze.EntityQuery.from('Messages').orderByDesc('Id').where('Id', '>', lastMessageID).expand('Poster'); 
     manager.executeQuery(query) 
      .then(function (newMessages) { 
       if (newMessages.results.length != 0) { 
        for (var count = 0; count < newMessages.results.length; count++) { 
         self.allMessages.unshift(newMessages.results[count]); 
         lastMessageID = newMessages.results[0].Id(); 
        } 
       } 
      }).fail(function (error) { 
       alert(error.name+" "+error.message); 
      }); 
    } 
} 

return { 
    getPosterByCallsign: getPosterByCallsign, 
    MessageViewModel: messageViewModel, 
    postMessage: postMessage, 
} 

이제 다른 js 모듈에서 refresh 메소드를 호출 할 수 있기를 원합니다. 어떻게이 문제를 해결할 수 있습니까? viewmodel은 다음과 같은 모듈에서 호출됩니다.

define(["common/dataService"], function(n0uk) { 
$(document).ready(function() { 
    ko.applyBindings(new n0uk.MessageViewModel()); 

    $('#postButton').click(function() { 
     n0uk.postMessage(window.message); 
    }); 
    $('#message').keypress(function(e) { 
     if (e.which == 13) { 
      n0uk.postMessage(window.message); 
      e.preventDefault(); 
     } 
    }); 
}); 

}); 당신은 PubSub을 사용할 수

답변

0

refresk

은 .... n0uk.postMessage() 호출 후 호출해야합니다.

PubSub.subscribe('refreshMessages', refresh); 

을하고 필요할 때마다 두 번째 모듈에 게시 :
귀하의 첫 번째 모듈에서 구독

PubSub.publish('refreshMessages'); 
+0

내 문제는 내가 전화/뷰 모델의 기능을 외부에서 새로 고침 기능을 수행 할 수 없다는 것입니다. messageViewModel.Refresh()와 같은 솔루션을 호출하고 싶습니다. UI 업데이트가 잘 작동하고 새로운 메시지가 self.allMessages 관찰 가능 배열에 삽입 된 것처럼 표시됩니다. 이는 문제가 아닙니다. –

+0

PubSub은 당신이 묘사 한 것과 정확히 일치하도록 설계되었습니다. 내가 너를 오해하지 않는다면. – Nit

+0

나는 그것에 잠수 할 것이다 ... –