我是角色的新手,我期待每当我对模型进行更改时,通过使用控制器,该更改将反映在我视图中的数据中。
我有一个工厂,可以创建我的数据模型
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
不是原始类型?如果是这样,我该如何解决这个问题呢?或者它完全是另一回事?
答案 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;
});