簡體   English   中英

角度控制器的頻繁更新未反映在視圖中

[英]Frequent updates to Angular controller not reflected in view

使用Angular處理一個有趣的問題,並從SignalR進行頻繁更新。

在服務器上,我有一個管理器的單例實例,當前設置為每500ms發送一次更新

    public void StartTest() {
        var i = 0;
        while (i < 1000) {
            if (_cancelRequested) {
                _cancelRequested = false;
                return;
            }
            _context.Clients.All.sent(i++);
            Thread.Sleep(500);            

在我看來,我正在使用“ controller as vm”語法:

{{vm.status}}

終於在我的控制器中(基於signalR初始化):

    // Using 'Controller As' syntax, so we assign this to the vm variable (for viewmodel).
    var vm = this;
    vm.status = '';
    ...
    function activateSignal() {
        var hub = $.connection.mailerHub;

        hub.client.sent = function (counter) {
            log(' singal_R ## event: sent ' + counter);  // <-- this works on every update
            vm.status = counter;  // this works only on last update, or if stop is pressed it writes the most recent update. 
        };

該代碼可以完成2件事:寫入日志(這會將Toastr更新發送到瀏覽器),並在控制器上設置狀態變量。

日志注釋會按預期方式在瀏覽器中反映出來,每半秒鍾我會收到帶有事件編號的漂亮的Toastr通知,但是設置變量不會產生任何效果,直到我請求停止或達到999為止。

當我按下停止鍵時,vm.status會以最后一個序列號寫出,或者當整個事情停止時,它會寫出999。

所以看來在vm上設置屬性的頻率有問題嗎? 我需要像$ scope。$ watch這樣的東西嗎?

好吧,對我來說,您要實現的目標還不夠清楚,但是看起來您是在angular的控制范圍之外更新模型的。 因此,您需要將正在執行的操作通知Angle。

最有可能的是,這樣的事情應該可以解決問題:

hub.client.sent = function (counter) {
   $scope.apply(function(){
      log(' singal_R ## event: sent ' + counter);
      vm.status = counter;
   });
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM