Javascript 角度表不会在某些物体上触发

Javascript 角度表不会在某些物体上触发,javascript,angularjs,angularjs-directive,promise,Javascript,Angularjs,Angularjs Directive,Promise,以下问题:创建监视属性的元素指令时,如果监视的表达式使用Kris Kowal的Q库解析为承诺,则监视不会触发。JSFiddle: 片段: var module = angular.module("my-module", []); angular.module('my-module').directive('promise', function ($compile) { return { link: function (scope, iElement, iAttrs) {

以下问题:创建监视属性的元素指令时,如果监视的表达式使用Kris Kowal的Q库解析为承诺,则监视不会触发。JSFiddle:

片段:

var module = angular.module("my-module", []);

angular.module('my-module').directive('promise', function ($compile) {
    return {
        link: function (scope, iElement, iAttrs) {

            // watch variant 1, watching the expression directly
            scope.$watch(iAttrs['use'], function(newValue, oldValue) {
               console.log('1.)', newValue, oldValue); 
            });

            // watch variant 2, using a function and $eval to evaluate the expression
            scope.$watch(function(scope) {
                return scope.$eval(iAttrs['use']);
            }, function(newValue, oldValue) {
               console.log('2.)', newValue, oldValue); 
            });

            // watch variant 3, using a function and return watched expression, this
            // works only for atomar expressions, but is the only one to trigger if
            // the expression resolves to a promise
            scope.$watch(function(scope) {
                return scope[iAttrs['use']];   
            }, function(newValue, oldValue) {
               console.log('3.)', newValue, oldValue); 
            });
        },
        restrict: 'E'
    };
});

function MyCtrl($scope) {
    var promise = Q.defer().promise;
    //promise = { a: 'Hello World', b: 1337 };

    $scope.pr = promise;
    $scope.getPr = function() {
        return promise;   
    }
}
HTML看起来很简单:

<div ng-app="my-module">
    <div ng-controller="MyCtrl">
        <promise use="getPr()"></promise>
        <promise use="pr"></promise>
    </div>
</div>
第一个promise元素只触发带有promise的watch1和watch2。Watch 3显然无法解析,因为语法已经错误。这就是我们所期望的一切

第二个promise元素仅显示触发器watch3,这是意外的

如果取消对控制器中的行的注释以与标准对象交换承诺,则一切都会按预期触发

我错过什么了吗?Angular docs说它用来测试不断变化的对象。如果我用未定义的测试我的承诺,它会返回真的