第一次更改后无法在使用工厂的控制器之间共享数据

问题描述 投票:0回答:1

我知道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
           }, 
        },
    });
}])
javascript angularjs angularjs-directive angularjs-scope
1个回答
0
投票

PathController中,$scope.Datalattitudelongittudename仅是字符串值。更改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 */);
© www.soinside.com 2019 - 2024. All rights reserved.