2017-04-08 77 views
0

我正在嘗試更新多個組件的視圖。出於這個原因,我正在使用廣播。如果我使用我的代碼而不使用$ apply(),則視圖不會更新。如果我在多個視圖中使用apply,我正在'[$ rootScope:inprog] $ apply already progress'錯誤。更新多個視圖

更改代碼

service.prototype.setNewTopic = function (topic) { 
    var self = this; 
    var promise = $http(
    { 
     method: 'POST', 
     url: self.baseUrl + 'Admin/setNewTopic', 
     contentType: 'application/json', 
     data: { 
      topicName: topic 
     } 
    }); 

    return promise; 
} 
+0

這並不是真的很清楚你在嘗試什麼o從這個片段中完成,但它*看起來像*您試圖廣播並讓每個組件都獲得數據以響應廣播。這看起來效率不高,但數據絕對應該在不使用'$ scope。$ apply()'的情況下更新。這**感覺像** [XY問題](https://meta.stackexchange.com/a/66378/297619)。你應該詢問爲什麼你的數據沒有在第一時間更新,而不是爲什麼'$ scope。$ apply()'不起作用。換句話說,顯示你的組件和它的視圖[mcve]。 – Claies

+0

謝謝。如果這種接縫效率低下,可否請您指出我更有效的方式 – user6934713

+0

不是沒有看到*你實際想要做什麼*的例子,沒有。 – Claies

回答

1

我改變你的方法$的行爲,它應該recive從$廣播的數據,我想在適當的組件設置。

//控制器 - 我假設在控制器中的$ scope屬性被稱爲$ scope.newTopic

service.setNewTopic($scope.newTopic).then(function(data) { 
     $rootScope.$emit('testMonitor',$scope.newTopic) 
    }) 

//這些每一個聆聽組件

$rootScope.$on('testMonitor', function(data) { 
    $scope.newTopic = data; 
}); 

我改變了服務只做http工作 //服務

service.prototype.setNewTopic = function (topic) { 

    return $http(
    { 
     method: 'POST', 
     url: self.baseUrl + 'Admin/setNewTopic', 
     contentType: 'application/json', 
     data: { 
      topicName: topic 
     } 
    }); 

} 
+0

非常感謝。這就是我需要的。即使在我正在設置主題的控制器中,也要以同樣的方式使用它。或者我需要爲此創建一個單獨的HTTP。或者,也許我應該回復承諾,然後播出。 – user6934713

+0

我想控制器應該調用你的service.setNewTopic(topic)。我個人認爲控制器應該處理廣播,service.setNewTopic()。然後(函數(數據){$ rootScope。$ emit('testmonitor',data)})。這意味着該服務應該只進行http調用,只...我也將它從$ rootScope。$ broadcast('testMonitor')更改爲$ rootScope。$ emit('testMonitor'),因爲這是一個較便宜的調用make –

+0

謝謝。我認爲我在廣播的數據是json對象,但我有'成功'。我試圖解析它像:self.newTopic = $ .parseJSON(data); 。我得到了錯誤,說明json不正確。我可以在視圖中設置數據嗎?如何在控制器中更改代碼中設置數據? – user6934713