了解为什么我的角度控制器没有更新模型更改

时间:2013-06-29 05:33:59

标签: angularjs model-binding

我是角色的新手,我期待每当我对模型进行更改时,通过使用控制器,该更改将反映在我视图中的数据中。

我有一个工厂,可以创建我的数据模型

app.factory('Calendar', function($http){
  return { months : [//array of month names //],
           calendar : function(){
                      // a bunch of stuff that builds the current month
                return calendar;
                },
            activeDate : function(){
                return this.calendar()[0];
            }
         }
});

然后在我的控制器中我有

  app.controller('CalendarCtrl',function($scope,Calendar){
       $scope.calendar = Calendar.calendar();

       $scope.setActiveDay = function(){
           // this is triggered by a click event when the user clicks the day on a calendar
           Calendar.activeDay = this.day;
       }
   });

  app.controller('DayCtrl', function($scope,Calendar){
        $scope.activeDay = Calendar.activeDay();
   });

我期待发生的事情是,setActiveDay方法会更改Calendar.activeDay,并且视图会自动填充正确的日期信息。

我从this.day输出setActiveDay,我可以看到值正在正确更新,但DayCtrl没有获取更改。

有人可以向我解释为什么会这样吗?是因为我的Calendar.activeDay不是原始类型?如果是这样,我该如何解决这个问题呢?或者它完全是另一回事?

1 个答案:

答案 0 :(得分:2)

首先,我认为$scope.activeDay = Calendar.activeDay();应该是

$scope.activeDay = Calendar.activeDay;

现在,让我们来解决你的问题。最初,Calendar.activeDay$scope.activeDay指的是同一个this.day;但是,当您再次Calendar.activeDay = this.day时,Calendar.activeDay会更改为指向新的一天,但$scope.activeDay仍然指的是之前的this.day,这就是DayCtrl的原因没有接受改变。

看起来您正在使用Calendar对象在范围之间进行通信,因此解决问题的一种方法是将Calendar对象附加到每个范围,并在ngModel中使用Calendar.activeDay 。另一种方法是在DayCtrl中使用$scope.$watch

$scope.$watch(function() {
    return Calendar.activeDay;
}, function(newDay) {
    $scope.activeDay = newDay;
});