javascript - 获取 $watch 不是 AngularJS 中的函数错误

标签 javascript angularjs

我正在尝试在开始日期大于结束日期时自动更新我的 ui Bootstrap 日期选择器的结束日期。日期选择器在模态中,功能在 AngularJS 中完成。

我见过的所有示例都使用 $watch 和 $scope(即 $scope.$watch),但我的代码没有 $scope,不确定我的情况下的语法是什么。

我得到:错误:vm.event.$watch 不是函数

Html(最小日期设置为结束日期的“vm.event.startsAt”

      <div class="row">

                <div class="col-md-6">
                START DATE:<br />
                <p class="input-group" style="max-width: 250px">
                <input type="text" class="form-control" readonly datepicker-popup="medium" ng-model="vm.event.startsAt" is-open="vm.event.startOpen" close-text="Close" />
                <span class="input-group-btn">
                <button type="button" class="btn btn-default" ng-click="vm.toggle($event, 'startOpen', vm.event)"><i class="glyphicon glyphicon-calendar"></i></button>
                </span>
                </p>
                <timepicker ng-model="vm.event.startsAt" hour-step="1" minute-step="15" show-meridian="true"></timepicker>
                </div>

                <div class="col-md-6">
                END DATE:<br />
                <p class="input-group" style="max-width: 250px">
                <input type="text" class="form-control" readonly datepicker-popup="medium" ng-model="vm.event.endsAt" min-date="vm.event.startsAt" is-open="vm.event.endOpen" close-text="Close" />
                <span class="input-group-btn">
                <button type="button" class="btn btn-default" ng-click="vm.toggle($event, 'endOpen', vm.event)"><i class="glyphicon glyphicon-calendar"></i></button>
                </span>
                </p>
                <timepicker ng-model="vm.event.endsAt" hour-step="1" minute-step="15" show-meridian="true"></timepicker>
                </div>
      </div>     

AngularJS

'use strict';

angular
  .module('demo', ['mwl.calendar', 'ui.bootstrap', 'ngTouch', 'ngAnimate', 'ui.bootstrap.demo'])

  .controller('MainCtrl', function ($modal, moment, $http, $location) {

/* 
******************************************
****  Show Event Modal
******************************************
*/
    function showEventModal(action, event, events) {

      var modalInstance;

        modalInstance = $modal.open({
        templateUrl: 'modalEventContent.html',
        controller: function() {
          var vm = this;
          vm.action = action;
          vm.event = event;

          vm.events = events;

          vm.toggle = function($event, field, event) {
                $event.preventDefault();
                $event.stopPropagation();
                vm.event[field] = !vm.event[field];
          };

          // ----------------------------             
          // ------  Problem HERE -------
          // ----------------------------                         
          // ------  Update END DATE based on the START DATE 
          vm.event.$watch('startsAt', function (newVal, oldVal) {
            if(!newVal) return;

            // if the new start date is greater than the current end date .. update the end date
            if(vm.event.endsAt){
              if( +vm.event.endsAt < +vm.event.startsAt ){
                vm.event.endsAt = newVal;
              }
            } else {
              // just set the end date
              vm.event.endsAt = newVal;
            }
          });   


          vm.eventSaved = function(event) { 

               $http.put(urlapievents + event.eventid, vm.event).success(function(eventsuccess){
               }).error(function(err){
                    /* do something with errors */
               });

               modalInstance.close();
          };

          modalInstance.close();
          };

        },
        controllerAs: 'vm'
      });
    }

更新#1

将 $scope 依赖项添加到我的 Controller 中,错误消失了,但函数没有对更改使用react

      // ------  Update END DATE based on the START DATE (only valid for calendar view)
      $scope.$watch('vm.event.startsAt', function (newVal, oldVal) {
        if(!newVal) return;

        // if the new start date is greater than the current end date .. update the end date
        if(vm.event.endsAt){
          if( +vm.event.endsAt < +vm.event.startsAt ){
            vm.event.endsAt = newVal;
          }
        } else {
          // just set the end date
          vm.event.endsAt = newVal;
        }
      });   

最佳答案

$scope 依赖项添加到您的 Controller :

.controller('MainCtrl', function ($scope, $modal, moment, $http, $location) { ..}

这就是找不到 $watch 的原因,因为它属于一个不存在的范围对象。

关于javascript - 获取 $watch 不是 AngularJS 中的函数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33782942/

相关文章:

javascript - AngularJS:如何在指令中返回带有新同级元素的原始元素?

javascript - ng-style 不适用于嵌套对象?

javascript - 在 asp.net 中隐藏更新面板中的 div

javascript - 访问以www开头的网页地址时没有 'Access-Control-Allow-Origin' header 。没有 www 它可以工作 - 为什么?

javascript - 仅显示一组 sibling 中的两个 <br>

javascript - 将 React Native 应用程序集成到现有的 iOS Obj-C/Swift 应用程序中

javascript - 输入字段有效后清除错误

javascript - 无法使用 Angular.js 动态启用文本字段

javascript - 使用 javascript 和 Angular 进行嵌套计算 (v1)

javascript - 有没有办法在 document.write 中编写 i/else 语句?