angularJS范围未针对promise块内的函数属性进行更新

时间:2014-03-23 19:44:42

标签: angularjs scope angularjs-directive promise angularjs-controller

controller('SomeController', function($scope, simpleFactory, $routeParams) {

    init();

    function init() {
        var myDataPromise = simpleFactory.getStuff($routeParams.id);

        // The method A works fine here
        $scope.A = function() {
          //return result['someAttrOfResult']
          return 90
        }

        myDataPromise.then(function(result) {
            // B is a regular object and works fine
            $scope.B = result;

            // The method A does not work here
            $scope.A = function() {
                //return result['someAttrOfResult']
                return 90
            }
        })


}

在我看来,我可以这样做:

<h1>{{B.someAttrOfResult}}</h1>

但不是这样的,除非我在promise块之外创建方法A():

<mydirective value="A()" ></mydirective>

当然我的最终目标是让A()返回对象的任何属性,而不是硬编码值。但即使对返回值进行硬编码也不会在承诺内部起作用。如果我将它移到外面,将其设置为$ scope.B [&#39; someAttrOfResult&#39;]不起作用,因为承诺可能尚未完成。

2 个答案:

答案 0 :(得分:0)

我不确定simpleFactory.getStuff方法发生了什么,所以我可能错了,但可能你错过了$ scope。$ apply()调用了#34;解决&# 34 ;.当异步操作完成/失败时,Angular的$ q承诺不会立即被解决/拒绝,但是它们会在下一个$ digest阶段结算。

从例如返回的承诺。 $ http服务没有这个问题,因为他们必须调用已经内置的摘要周期,但是当你使用&#39; raw&#39; $ q服务,您需要使用$ scope手动触发此承诺的结算。$ apply()。希望它有所帮助!

答案 1 :(得分:0)

事实证明有一个拼写错误:(,该指令的原始代码具有以下内容:

scope.$watch('value', function () {
      if (scope.gauge) {
        scope.gauge.redraw(scope.value);       
      }
});

当我用函数调用替换{{value}}时,&#34; value()&#34;,我忘记将上面的手表替换为:

scope.$watch('value()', function () {
      if (scope.gauge) {
        scope.gauge.redraw(scope.value());       
      }
});

我确实更改了重绘,但不是他的范围。$ watch one。