我可以避免使用$ scope。$ watch返回一个未定义的值吗?

时间:2014-03-18 13:12:01

标签: javascript angularjs

当我通过$scope.$watch观察Angular中的范围变量时,只有在第一次调用watch函数时才会显示undefined

是否可以重写我的代码以避免对undefined进行不必要的检查?

这是一个最小的例子:

1)jsfiddle

2)HTML:

<div ng-app="MyApp">
   <div ng-controller="MyCtrl">Enter some text:
      <input type="text" ng-model="text" size="30" />
      <p>You entered: {{text}}</p>
      <p>Length: {{textLength}}</p>
   </div>
</div>

3)Javascript:

angular.module('MyApp', []).controller(
  'MyCtrl', function ($scope) {
    $scope.textLength = 0;
    $scope.$watch('text', function (value) {
      if (typeof value !== 'undefined') {
        $scope.textLength = value.length;
      } else {
        $scope.textLength = 'observed value is undefined';
      }
    });
});

2 个答案:

答案 0 :(得分:11)

如果您在视图模型中为已监视的属性设置了默认空值,则表示您不会遇到undefined值的问题。

在您的情况下,在$scope.textLength初始化之前或之后添加此内容(请检查此fiddle)。

$scope.text = '';

答案 1 :(得分:3)

避免未定义错误的另一个选项是你可以将函数包装在hasOwnProperty if语句中。

$scope.$watch('text', function (value) {
  if($scope.hasOwnProperty('text')) {
    if (typeof value !== 'undefined') {
        $scope.textLength = value.length;
      } else {
        $scope.textLength = 'observed value is undefined';
      }
    });
  }
};