我知道angularjs进行两种方式的数据绑定。我有两个想互相交谈的控制器。我使用工厂让他们彼此交流。在AppCtrl
控制器中,我为Data.mydata.buildingName
分配了相同的名称。这是我在做什么:
调用AppCtrl
,并更改buildingName
的值。
然后,当我调用PathController
时,它知道buildingName
的值已更改并显示。
但是当我回到AppCtrl
并再次更改buildingName
的值时,PathController
似乎不知道这一点。
有人可以告诉我我做错了什么吗?
//工厂
.factory('Data', function(){
return {
mydata: {
buildingName: 'Campus',
shortName: 'Main',
lattitude: '35.720031000963',
longittude: '-87.343068987131'
}
};
})
//控制器一
.controller('AppCtrl', function($scope, Data, $http, $ionicModal, $timeout) {
// map location
$scope.mapLocation = function(name, shortName, lattitude, longittude) {
Data.mydata.buildingName= name;
Data.mydata.shortName= shortName;
Data.mydata.lattitude= lattitude;
Data.mydata.longittude = longittude
$scope.Data = Data.mydata;
console.log("From AppCtrl: " + Data.mydata.buildingName+ " "+ Data.mydata.shortName+" "+ Data.mydata.lattitude + " "+ Data.mydata.longittude );
$scope.modal.hide();
}
})
//控制器二
.controller("PathController", [ '$scope', 'Data', function($scope, Data) {
$scope.Data = Data.mydata.buildingName;
var name = Data.mydata.buildingName + " - " + Data.mydata.shortName;
lattitude = Data.mydata.lattitude;
longitude = Data.mydata.longittude;
angular.extend($scope, {
center: {
lat: 35.720031000963,
lng: -87.343068987131,
zoom: 17
},
markers: {
Campus: {
lat: longitude,
lng: lattitude,
focus: true,
draggable: false,
message: name
},
},
});
}])
在PathController
中,$scope.Data
,lattitude
,longittude
和name
仅是字符串值。更改Data.mydata
的属性不会影响它们。
监视值更改并相应更新控制器值的一种方法是使用$scope.$watch()
:
// add at the end of PathController
$scope.$watch(function () {
return Data.mydata;
}, function (newValue) {
$scope.Data = newValue.buildingName;
$scope.markers.Campus.lat = newValue.lattitude;
$scope.markers.Campus.long = newValue.longittude;
$scope.markers.Campus.message = newValue.buildingName + " - " + newValue.shortName;
}, true /* check for object equality */);