$ rootScope事件和Promise之后的范围更新未反映在视图中

时间:2016-07-01 13:04:03

标签: javascript angularjs

看到几个人有类似的问题,但通常的范围。$ apply对我不起作用($ digest已经在进行中)。今天敲我的头。

请在下面找到我的指令的简化但完整版本。

  1. initialize()将myValue设置为其初始值。
  2. $ rootScope事件被捕获。
  3. 承诺正在得到解决。
  4. $ localStorage已更新
  5. console.log(myValue)提供正确的值。
  6. 但我的视图未更新。发生什么事了?!

    
    
    (function () {
      'use strict';
    
      angular
        .module('myApp')
        .directive('myDirective', myDirective);
    
      function myDirective($rootScope, $localStorage, MyPromise, MyService) {
        var linkFunction = function (scope, element, attributes) {
    
          scope.myValue = null;
    
          $rootScope.$on('someEvent', function (event, data) {
    
            MyPromise().get({}, function (result) {
              $localStorage.result = result;
              scope.myValue = MyService.getFromLocalStorageAndReturnStuff();
              console.log(scope.myValue);
            });
          });
    
          initialize();
    
          function initialize() {
    
            scope.myValue = MyService.getFromLocalStorageAndReturnStuff();
    
          }
        };
    
    
        return {
          restrict: 'A',
          transclude: true,
          replace: true,
          scope: {
            someProperty: '=myProperty'
          },
          link: linkFunction,
          templateUrl: 'myTemplate.html'
        };
      }
    })();
    
    {{myValue}}
    
    
    

2 个答案:

答案 0 :(得分:0)

链接功能不会观察模型更改,因此请在applyAsync函数

中设置变量
scope.$applyAsync(function(){
//set here
});

答案 1 :(得分:0)

为我工作的是我有一个外部范围属性(scope.someProperty),当我的事件发生时,它也会发生变化。

观看它确实会改变视图中反映的范围。

我知道如果真的必须对某些事件作出反应,这不是一个完美的解决方案,但我想提供我的解决方案,以防它可能对其他人有帮助。

如果有人可以回答真正的问题,我很乐意接受他的回答。



(function () {
  'use strict';

  angular
    .module('myApp')
    .directive('myDirective', myDirective);

  function myDirective($rootScope, $localStorage, MyPromise, MyService) {
    var linkFunction = function (scope, element, attributes) {

      scope.myValue = null;

      scope.$watch('someProperty', function(newVal){
      
        if(newVal!==null){
          MyPromise().get({}, function (result) {
             $localStorage.result = result;
             scope.myValue = MyService.getFromLocalStorageAndReturnStuff();
          });
        }
        
      });
      
      initialize();

      function initialize() {

      }
    };


    return {
      restrict: 'A',
      transclude: true,
      replace: true,
      scope: {
        someProperty: '=myProperty'
      },
      link: linkFunction,
      templateUrl: 'myTemplate.html'
    };
  }
})();