【问题标题】:Angular $watch: TypeError: Cannot read property of undefinedAngular $watch:TypeError:无法读取未定义的属性
【发布时间】:2015-07-27 10:47:09
【问题描述】:

我有这个$watch,它将过滤器应用于日期格式:

$scope.$watch(function() {
    return pn.myObj.birthDate;
},function(n,o){
    var dateView = $filter('date')(pn.myObj.birthDate,'yyyy-MM-dd');
    pn.myObj.birthDate = dateView;
});

第一次加载我在控制台中阅读的页面:

TypeError: 无法读取未定义的属性“birthDate”

当我的对象是undefined时,如何防止$watch出现问题?

【问题讨论】:

  • 将返回声明更改为pn.myObj && pn.myObj.birthDate

标签: angularjs


【解决方案1】:

在调用 $watch 函数时,您的对象没有初始化。在尝试访问它的属性之一之前检查它是否存在。

$scope.$watch(function() {
    return pn && pn.myObj && pn.myObj.birthDate;
}

【讨论】:

  • 我在控制台读到了同样的错误,但现在在var dateView = $filter('date')(pn.myObj.birthDate,'yyyy-MM-dd');行触发
【解决方案2】:

只要确保你做了正确的错误处理,

$scope.$watch(function() {
        if(angular.isDefined(pn.myObj) && angular.isDefined(pn.myObj.birthDate)) {
          return pn.myObj.birthDate;
        }
    },function(n,o){
        if(n != null) {
           var dateView = $filter('date')(n,'yyyy-MM-dd');
           pn.myObj.birthDate = dateView;
        }
    });

你也可以添加到回调中,

$scope.$watch(function() {
    return pn.myObj.birthDate;
},function(n,o){
    if(n != o) {
       var dateView = $filter('date')(n,'yyyy-MM-dd');
       n = dateView;
    }
});

这样,您的代码不会在每个返回值时都执行。

【讨论】:

  • 同样在这个解决方案中,错误现在在var dateView = $filter('date')(pn.myObj.birthDate,'yyyy-MM-dd');行触发
  • 那是因为您没有使用返回的结果,而是直接访问该对象。我编辑了上面的结果。
  • 此外,只需 console.log 您的对象并查看未定义的位置。您实际上应该确保您的对象首先按时启动。
  • 我注意到有一个点不见了 :) 再试一次。
  • 还评估 dateView,看看它是否真的返回任何值。也许那是未定义的。
猜你喜欢
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 2015-09-08
  • 2016-05-12
  • 2019-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多