2013-05-09 10 views
4

在試圖回答關於在兩個單獨的控制器之間共享數據的問題時,我遇到了一個問題。使用控制器之間的共享服務進行髒檢查,一種方法適用於另一種不適用?

我通常使用服務爲這項任務,並開始創建一個jsfiddle,但我無法讓它工作。

經過一些調試後,如果我在setActivePersonWorks(person)中動態創建屬性,髒檢查工作,第二個控制器顯示正確的值。

如果我分配了setActivePersonDoesNotWork()中的值,它沒有。

如果我使用$timeout()我能夠驗證DataService.badPerson是否確實包含正確的數據。

我做錯了什麼?我猜如果你用$apply()做些什麼,它會正常工作,但爲什麼動態地創建值導致事情正常工作?

工作實例:

var myTest = angular.module("MyTest", []); 
myTest.factory("DataService", function() { 
    var People = { 
     goodPerson: {}, 
     badPerson: {}, 
     setActivePersonWorks: function (person) { 
      People.goodPerson.name = person.name; 
      People.goodPerson.id = person.id; 
     }, 
     setActivePersonDoesNotWork: function (person) { 
      People.badPerson = person; 
     } 
    }; 
    return People; 
}); 

function ViewController($scope, DataService, $timeout) { 
    $timeout(function() { 
     DataService.setActivePersonWorks({ 
      id: 1, 
      name: "Good Mark" 
     }); 
     DataService.setActivePersonDoesNotWork({ 
      id: 2, 
      name: "Bad Mark" 
     }); 
    }, 1000); 
} 

function DetailController($scope, DataService, $timeout) { 
    $scope.goodPerson = DataService.goodPerson; 
    $scope.badPerson = DataService.badPerson; 

    $timeout(function(){ 
     $scope.message = "DataService has the value: " + DataService.badPerson.name + " but $scope.badPerson is " + $scope.badPerson.name; 
    }, 2000); 
} 

<html/>

<div ng-app="MyTest"> 
    <div ng-controller="ViewController"></div> 
    <div ng-controller="DetailController"> 
     <h1>Works: {{goodPerson.name}}</h1> 

     <h1>Does Not Work: {{badPerson.name}}</h1> 
     {{message}} 
    </div> 
</div> 

On jsfiddle

回答

9

當角看到

<h1>Does Not Work: {{badPerson.name}}</h1> 

它建立了一個$觀看對象badPerson。看看你的控制器,$scope.badPerson是對象DataService.badPerson的參考。一切都很好那麼遠,該問題發生在這裏:

setActivePersonDoesNotWork: function (person) { 
    People.badPerson = person; 
} 

當該功能執行,badPerson被賦予一個新的/不同對象的引用,但控制器仍然是$看老/原始對象引用。

的解決辦法是使用angular.copy()更新現有badPerson對象,而不是分配一個新的參考:

setActivePersonDoesNotWork: function (person) { 
    angular.copy(person, People.badPerson); 
} 

這也解釋了爲什麼setActivePersonWorks()作品 - 它不分配一個新的對象引用。

+0

優秀!感謝修復和解釋。 – 2013-05-09 16:02:32

相關問題