2016-03-05 95 views
1

我设置在我的控制器以下守望者:

var embeds = {twitter: false, facebook: false}; 

$scope.$watch(embeds, function(newVal, oldVal) { 
    if(embeds.twitter && embeds.facebook) $scope.loading = appLoader.off(); 
}); 

这应该火的时候,embeds变化。我有以下功能,检查我的所有嵌入式Tweets和Facebook帖子是否已加载页面。当所有Tweets或Facebook帖子都被加载后,它会在$timeout块内更新embeds以触发摘要循环。

checkFBInit(); 

twttr.ready(function(twttr) { 
    twttr.events.bind('loaded', function(event) { 
     $timeout(function() { 
      embeds.twitter = true; 
     }); 
    }); 
}); 

function checkFBInit() { 
    // Ensure FB.init has been called before attempting to subscribe to event 
    var fbTrys = 0; 
    function init() { 
     fbTrys++; 
     if (fbTrys >= 60) { 
      return; 
     } else if (typeof(FB) !== 'undefined') { 
      fbTrys = 60; 
      FB.Event.subscribe('xfbml.render', function() { 
       $timeout(function() { 
        embeds.facebook = true; 
       }); 
      }); 
      return; 
     } else { 
      init(); 
     }; 
    }; 
    init(); 
}; 

我遇到的问题是,当我设置我的守望者只能触发一次。我已经尝试绑定embeds$scope和/或观看embeds.twitterembeds.facebook,但是观察者只能发射一次。

回答

3

用途:

$scope.embeds = {twitter: false, facebook: false}; 
$scope.$watch('embeds', function(newVal, oldVal) { 
    if ($scope.embeds.twitter && $scope.embeds.facebook) { 
     $scope.loading = appLoader.off(); 
    } 
}, true); 

https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope。第一个参数必须是stringfunction,它返回参数的名称。

+2

Upvoted你的答案,因为它是我需要的解决方案的一半。我在第二次重新阅读文档后意识到,我还需要通过将'true'作为第三个参数传递给观察者来检查对象是否相等。将观察变量作为字符串传递给观察者是另一半问题。如果您接受编辑,我会将其标记为答案。 – ACIDSTEALTH

+0

感谢您的评论。我曾在一年前使用角度,忘记这个细微差别:) –