Knockout视图模型返回函数(如何?)

Knockout viewmodel returning function (how to?)

本文关键字:如何 函数 视图 模型 返回 Knockout      更新时间:2023-09-26

我有一个显示数据库消息的应用程序。将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模块调用刷新方法。我怎样才能做到这一点?视图模型是从如下模块调用的:

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()调用之后调用。。。。

您可以使用PubSub
订阅您的第一个模块:

PubSub.subscribe('refreshMessages', refresh);

并在需要时在您的第二个模块中发布:

PubSub.publish('refreshMessages');