2014-10-06 106 views
1

我想控制器之間的數據共享:共享數據,AngularJS

<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-rc.4/angular.min.js"></script> 
<script> 
var myApp = angular.module('myApp',[]); 
myApp.factory('Data', function(){ 
    return {show: true, text: "Hello"}; 
}); 

myApp.controller('ctrl1', ['$scope', 'Data', function($scope, Data) { 
    $scope.data = Data; 
}]); 

myApp.controller('ctrl2', ['$scope', 'Data', function($scope, Data) { 
    $scope.click = function(){ 
     Data = {text:"Hello2", show:true}; 
    } 
}]); 
</script> 
<body ng-app='myApp'> 
<div style="background-color:red;margin-top:30px;" ng-controller="ctrl1"> 
    {{data.text}} 
</div> 
<div style="background-color:yellow;margin-top:30px;" ng-click="click()" ng-controller="ctrl2"> 
    Click to change data 
</div> 
</body> 

演示http://plnkr.co/edit/QHuWLYjBqDvl20fL7eeu?p=preview。這是行不通的,但是如果我寫

Data.text = 'Hello2'; 
Data.show = true; 

它完美的作品。演示http://plnkr.co/edit/xKtLUlBu0dQPUsiNCRyC?p=preview

只通過指定Json來更新模型是非常方便的,我該怎麼做呢?

+0

我怕你在這兩個鏈接相同plnkr對象案件 – maurycy 2014-10-06 13:50:20

+0

@maurycy對不起,固定現在我認爲 – user1506145 2014-10-06 13:53:17

回答

1

通過做Data = {text:"Hello2", show:true};你完全覆蓋了最初的Data對象,這會導致引用失效。這就是爲什麼你不能只分配全新的對象。然而,你可以做這樣的事情:

myApp.factory('Data', function(){ 
    return { 
     prop: {show: true, text: "Hello"} 
    }; 
}); 

及更高版本:

Data.prop = {text: "Hello2", show: true}; 
+0

偉大的想法,但似乎無法正常工作或http://plnkr.co/edit/gYChWzfQ2DkwKCOuL5Zw?p=preview – user1506145 2014-10-06 14:02:29

+0

http://plnkr.co/edit/ZH2UKazOzogeFrJVZdLp ?p = preview通過編寫'$ scope.data = Data.prop;'你再次從'Data.prop'中分離'$ scope.data'。它應該是'$ scope.data = Data'。 – dfsq 2014-10-06 14:05:56

+0

哦,我明白了,現在我明白了,thx :) – user1506145 2014-10-06 14:11:55

1

當你寫

Data = {text:"Hello2", show:true}; 

你是一個新的本地對象覆蓋本地Data變量

寫作時

Data.text = 'Hello2'; 
Data.show = true; 

也設置在父範圍鏈接的原始對象依然存在,要覆蓋變量Data對象的內部,而不是隻覆蓋本地Data鏈接