Knockout viewmodel返回函数(如何?)

时间:2014-09-01 17:49:34

标签: javascript knockout.js require

我有一个显示来自数据库的消息的应用程序。将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 ....

1 个答案:

答案 0 :(得分:0)

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

PubSub.subscribe('refreshMessages', refresh);

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

PubSub.publish('refreshMessages');