javascript - AngularJS $watch 无法在 if block 中工作

标签 javascript angularjs if-statement angularjs-scope angularjs-watch

我发现我的 Angular 脚本正在运行:

$scope.CurrentUser = null;
$scope.DatePicker = new Date();
$scope.$watch('DatePicker', function (newValue, oldValue) {
    if (newValue > new Date())
        $scope.DatePicker = new Date();
}, true);
<div>
    <input data-ng-model="DatePicker" type="date" id="datepicker" />
</div>

但如果我添加 if 语句则不会:

<div data-ng-if="!CurrentUser">
    <input data-ng-model="DatePicker" type="date" id="datepicker" />
</div>

尝试一下: http://codepen.io/anon/pen/jWBEVM

但我不明白为什么。是否存在已知问题?有人可以帮忙吗?

最佳答案

来自 doc

This directive creates new scope.

所以,就你而言

<div data-ng-if="!CurrentUser">
    <input data-ng-model="DatePicker" type="date" id="datepicker" />
</div>

DatePicker 此处添加到 ng-if 范围,而不是 Controller 的范围。

为了解决这个问题,你可以使用$parent属性

<div data-ng-if="!CurrentUser">
    <input data-ng-model="$parent.DatePicker" type="date" id="datepicker" />
</div>

或应用“点规则”

<div data-ng-if="!CurrentUser">
    <input data-ng-model="data.DatePicker" type="date" id="datepicker" />
</div>

在js中

$scope.data = { DatePicker : new Date() };
$scope.$watch('data.DatePicker', function (newValue, oldValue) {
...

有关继承范围的更多信息,请参阅 wiki

示例

var app = angular.module('myApp', []);

app.controller('BodyCtrl', function($scope, $http) {
  $scope.CurrentUser = null;
  $scope.DatePicker = new Date();
  $scope.data = { DatePicker : new Date() } ;
  $scope.$watch('DatePicker', function(newValue, oldValue) {
    if (newValue > new Date())
      $scope.DatePicker = new Date();
  }, true);
  $scope.$watch('data.DatePicker', function(newValue, oldValue) {
    if (newValue > new Date())
      $scope.data.DatePicker = new Date();
  }, true);

});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.7/angular.min.js"></script>
<div data-ng-app="myApp" data-ng-controller="BodyCtrl">
  <div>
    <span>scope id: {{$id}}</span>
    <input data-ng-model="DatePicker" type="date" id="datepicker" />
  </div>
  <div data-ng-if="!CurrentUser">
    <span>scope id: {{$id}}</span>
    <input data-ng-model="DatePicker" type="date"  />
  </div>
  <div data-ng-if="!CurrentUser">
    <span>scope id: {{$id}}</span>
    <input data-ng-model="$parent.DatePicker" type="date" />
  </div>
  <hr/>
  <div>
    <span>scope id: {{$id}}</span>
    <input data-ng-model="data.DatePicker" type="date" />
  </div>
  <div data-ng-if="!CurrentUser">
    <span>scope id: {{$id}}</span>
    <input data-ng-model="data.DatePicker" type="date"  />
  </div>
  
</div>

关于javascript - AngularJS $watch 无法在 if block 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34607095/

相关文章:

c# - 在 IF 子句中 OR'ing 多个值选项的替代方法是什么?

javascript - 如何旋转 Canvas 中的对象

javascript - 正确保存数据到mongoDB

javascript - 如果多个元素使用相同的自定义验证指令,如何验证表单?

java - 初级 Java if else 范围语句

Python Pandas 条件标记

javascript - 在 VueJS 中将一个输入框单向绑定(bind)到另一个输入框

Javascript对象获取父方法的this

javascript - 我可以将可拖动对象的助手而不是原始项目放入可排序对象中吗?

javascript - 通过 angularjs 更改模态窗口标题