2013-04-17 50 views
1

我知道这些模板可以绑定到一个承诺或一个真正的价值,当这个值改变模板更新。Angularjs - 看一个承诺 - 得到undefined

我想在一个指令中做类似的事情,在这里我观察承诺的变化,并在更新承诺时重新加载指令中的数据。

但是,当我看到承诺时,它似乎注册了更改,但立即设置为'未定义'。

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]); 
    }); 
}); 

感谢, 罗伊

+0

这与AngularJS生命周期有关。还有其他关于这个的答案。 $ watch在开始时至少调用两次,因此您可能需要检查undefined和newval == oldval。 – jpmorin

+0

感谢jpmorin,但这个问题更多的是承诺和非承诺之间的差异 - 这些情况返回到手表的值是不同的 –

回答

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,因为承诺尚未解决。然后解决该承诺(可能在接下来的$ digest循环中),然后将isAPromise设置为(已解决?)承诺的值。

+0

这可能是。我还有一些测试的想法 - 在我“噗”的时候会更新这个问题 –