如果model不为null,则AngularJS监视模型值

时间:2015-04-19 21:41:09

标签: angularjs angularjs-watch

这里的简单问题。 我有这样的手表:

// Watch our model
$scope.$watch(function () {

    // Watch our team name
    return self.model.team.data.name;
}, function (name) {

    console.log(name);

    // if we have a name
    if (name) {

        // Store our model in the session
        sessionStorage.designer = angular.toJson(self.model);
    }
});

团队模型是从数据库中作为承诺(因此是数据)引入的,因此当手表首次触发时, self.model.team 尚未设置,因此它为空。 如何让我的手表等到它被设置或添加检查手表的返回功能?

2 个答案:

答案 0 :(得分:2)

使用监视表达式而不是函数。这将捕获丢失对象的任何错误并返回undefined

// Watch our model
$scope.$watch('self.model.team.data.name', function (name) {

    console.log(name);

    // if we have a name
    if (name) {

        // Store our model in the session
        sessionStorage.designer = angular.toJson(self.model);
    }
});

答案 1 :(得分:1)

这里没有任何魔力 - 如果您访问的其中一个变量可能是null / undefined,那么如果null / {undefined / { {1}}。所以,你必须要防范:

$scope.$watch(
  function(){
    return (self.model.team && self.model.team.data.name) || undefined;
  }, 
  function(v){
    // ...
  });

唯一的魔法"是你" $ watch"对于表达式,但表达式需要在范围上公开。所以,你可以这样做:

$scope.model = self.model;
$scope.$watch("model.team.data.name", function(v){
  // ...
});

但是,实际上,你必须问自己为什么在这里需要$watch。在我看来,你异步获得team一次 - 看起来它不会改变,除非可能是另一个异步调用。因此,只需在没有$watch的情况下收到数据时处理:

someSvc.getTeam() // I made an assumption about a service that pulls the data from db
  .then(function(team){
     var name = team.data.name;

     // if we have a name
     if (name) {
        // Store our model in the session
        sessionStorage.designer = angular.toJson(self.model);
     }
  });

不必要的$watch是昂贵的 - 它会在每个摘要周期进行评估,因此,最好减少$ watchers的数量。