我有一个显示来自数据库的消息的应用程序。将Breeze.js用于服务器端API控制器,将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();
}
});
});
});
应该在n0uk.postMessage()调用之后调用refresk ....
答案 0 :(得分:0)
您可以使用PubSub 订阅你的第一个模块:
PubSub.subscribe('refreshMessages', refresh);
并在需要时在第二个模块中发布:
PubSub.publish('refreshMessages');