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을 사용할 수
내 문제는 내가 전화/뷰 모델의 기능을 외부에서 새로 고침 기능을 수행 할 수 없다는 것입니다. messageViewModel.Refresh()와 같은 솔루션을 호출하고 싶습니다. UI 업데이트가 잘 작동하고 새로운 메시지가 self.allMessages 관찰 가능 배열에 삽입 된 것처럼 표시됩니다. 이는 문제가 아닙니다. –
PubSub은 당신이 묘사 한 것과 정확히 일치하도록 설계되었습니다. 내가 너를 오해하지 않는다면. – Nit
나는 그것에 잠수 할 것이다 ... –