2016-03-29 52 views
1

我製作了2個控制器,一個用於實際頁面,另一個用於成功模式。我甚至從模態控制器播放,甚至在頁面控制器中收聽。我使用'this'來引用scope變量的當前實例。但是在$ on監聽器中,每當我嘗試使用scope變量時,都會發現它爲空,並且由於此原因,我無法修改頁面控制器變量。

在頁面控制器:

$rootScope.$on('backToFetch', function() { 
      for(var i=0; i < this.fetchUploader.documentData.length; i++) { 
       this.fetchUploader.documentData[i].isSuccess = false; 
       this.fetchUploader.progress = 0; 
      } 
      deleteFormFields() 
     }); 

在模態控制器:

​​

我怎樣才能獲得範圍變量$內部監聽

+0

什麼範圍?在應用程序中可能有大量的作用域 – Dalorzo

+0

爲什麼使用'this'而不是'$ scope'如果這就是你想要實現的目標? –

+0

通常你會發送數據到你的事件。因此'$ rootScope。$ broadcast('backToFetch','一些額外的數據');'並且在你的處理程序接收到這個數據:'$ rootScope。$ on('backToFetch',function(e,data){});''數據可以是任何東西。你的控制器之間還有什麼層次,你可能不需要污染'$ rootScope'。 – ste2425

回答

0

您可以複製範圍狀態參考至event arguments,如下所示:

$rootScope.$broadcast('backToFetch', { 
    scope: angular.extend($scope, {}) 
}); 

而且你現在可以讀取它,像這樣的值:

$rootScope.$on('backToFetch', function(event, args) { 
    console.log(args.scope); 
}); 

這不會修改源控制範圍。由於一個控制器不應該直接修改另一個控制器的範圍,因此應該通過使用事件來執行此類操作。

其次,你應該副本只有那些論據從範圍,你需要,複製整個範圍可能是矯枉過正-bad做法。

+0

您建議的方式有助於修改廣播控制器中的值,但我需要修改正在監聽廣播的控制器的值。該範圍在偵聽器中找到null。 –

+0

那麼爲什麼不從監聽器發送另一個事件,這將被源控制器捕獲?你可以在這裏找到更多關於這個問題的地方:http://stackoverflow.com/questions/28806321/angularjs-can-i-change-scope-value-of-a-controller-from-another-controller – Beri