1

我知道模板可以绑定到承诺或真实值,并且当该值更改时,模板会更新。

我想在指令中做类似的事情,我观察对承诺的更改,并在更新该承诺时重新加载指令中的数据。

但是,当我看到一个承诺时,它似乎注册了更改,但随后立即设置为“未定义”。

http://plnkr.co/edit/eOjkuvyrQvKhkAbVLGVG?p=preview

如您所见,模板更新没有问题,但如果您检查控制台,“isNotAPromise”手表按预期工作,但“isAPromise”手表被触发两次,都是“未定义”。

有什么线索吗?

这是让您非常高兴的代码:

app.controller('MainCtrl', function($scope, $q) {
  var c;
  c = 1;
  setInterval(function() {
    c = c + 1;
    console.log('---------------');
    console.log(['c changed to ', c]);
    return $scope.$apply(function() {
      $scope.isNotAPromise = c;
      return $scope.isAPromise = $q.when(c);
    });
  }, 1000);
  $scope.$watch('isAPromise', function(newVal, oldVal) {
    return console.log(['isAPromise changed', oldVal, newVal]);
  });
  return $scope.$watch('isNotAPromise', function(newVal, oldVal) {
    return console.log(['isNotAPromise changed', oldVal, newVal]);
  });
});

谢谢,罗伊

4

1 回答 1

2

我添加了一个时间戳来确定两个手表何时触发:

console.log [+new Date(), 'isAPromise changed', oldVal, newVal]

样本输出:

["c changed to ", 3] app.js:12
[1366223960472, "isAPromise changed", 2, undefined] app.js:19
["isNotAPromise changed", 2, 3] app.js:22
[1366223960473, "isAPromise changed", undefined, 3] 

因此,两块手表isAPromise的发射间隔为 1 毫秒。我猜会发生什么$q.when(c)是第一次分配给 时$scope.isAPromise,这是undefined因为承诺尚未解决。然后 promise 被解析(可能在下一个 $digest 循环期间),isAPromise然后设置为(resolved?)promise 的值。

于 2013-04-17T18:49:23.687 回答