【问题标题】:Understanding why my angular controllers aren't updating on model changes了解为什么我的角度控制器没有在模型更改时更新
【发布时间】:2013-06-26 22:54:51
【问题描述】:

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

我有一个工厂来创建我的数据模型

app.factory('日历', function($http){ return { months : [//月份名称数组 //], 日历:函数(){ // 一堆构建当前月份的东西 返回日历; }, 活动日期:函数(){ 返回 this.calendar()[0]; } } });

然后在我的控制器中

app.controller('CalendarCtrl',function($scope,Calendar){ $scope.calendar = 日历.calendar(); $scope.setActiveDay = 函数(){ // 当用户点击日历上的日期时,这是由点击事件触发的 Calendar.activeDay = this.day; } }); app.controller('DayCtrl', function($scope,Calendar){ $scope.activeDay = Calendar.activeDay(); });

我所期望的是,setActiveDay 方法将更改 Calendar.activeDay,并且视图将自动填充正确的日期信息。

我从setActiveDay 中输出this.day,我可以看到这些值正在正确更新,但DayCtrl 没有接受更改。

有人可以向我解释这是为什么吗?是因为我的Calendar.activeDay 不是原始类型吗?如果是这样,我该如何解决这个问题?还是完全是别的东西?

【问题讨论】:

    标签: angularjs model-binding


    【解决方案1】:

    首先我觉得$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;
    });
    

    【讨论】:

    • 我想我明白你的意思了。当您说“将 Calander 对象附加到每个范围”时,您的意思是我的每个控制器中都应该有 $scope.calendarObj = Calendar 吗?我认为当我将($scope, Calendar) 传递给我的控制器时,那是有约束力的,或者我误解了你在说什么。如果没有必要,我宁愿不要 $watch。
    • 是的,我的意思是$scope.calendarObj = Calendar($scope, Calendar) 表示将服务注入到控制器中,控制器可以访问它,但对象不会自动出现在作用域中。
    • 我最终不得不将$scope.calendarObj = Calendar$scope.calendarObj.activeDay = ... 都放在我的每个控制器中。这似乎有点冗长,因为我认为activeDayCalendar 模型中activeDay 的副本,对孩子的任何更新都会自动填充。
    猜你喜欢
    • 2021-08-20
    • 1970-01-01
    • 2013-07-28
    • 2021-06-14
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    相关资源
    最近更新 更多