2014-09-01 44 views
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()调用后调用....

回答

0

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

PubSub.subscribe('refreshMessages', refresh); 

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

PubSub.publish('refreshMessages'); 
+0

我的问题是,我不能叫/从视图模型的功能之外执行的刷新功能。我想有一个像可以调用的messageViewModel.Refresh()这样的解决方案。 UI的更新工作正常,新消息显示为插入到self.allMessages可观察数组中,这不是问题。 – 2014-09-02 17:44:35

+0

PubSub的设计正是你所描述的,你看过它吗?除非我误解你。 – Nit 2014-09-02 18:23:44

+0

我会潜入它的... – 2014-09-03 18:05:28