0
我有一个应用程序显示来自数据库的消息。将Breeze.js用于服务器端API控制器和Knockout.js用于数据绑定。Knockout viewmodel返回函数(如何?)
最初我们得到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模块调用刷新方法。我怎样才能做到这一点?这个视图模型是这样从一个模块中调用的:
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();
}
});
});
});
的refresk应n0uk.postMessage()调用后调用....
我的问题是,我不能叫/从视图模型的功能之外执行的刷新功能。我想有一个像可以调用的messageViewModel.Refresh()这样的解决方案。 UI的更新工作正常,新消息显示为插入到self.allMessages可观察数组中,这不是问题。 – 2014-09-02 17:44:35
PubSub的设计正是你所描述的,你看过它吗?除非我误解你。 – Nit 2014-09-02 18:23:44
我会潜入它的... – 2014-09-03 18:05:28