使用IE 11和AngularJS的2路数据绑定问题

时间:2014-08-19 23:33:40

标签: javascript angularjs internet-explorer

我最近在我们的Web应用程序上构建了一个使用AngularJS的功能,我对IE 11的一些问题不正确$apply()对DOM的数据更改。出于某种原因,这种情况有时只会发生,并且在我尝试调试问题时永远不会发生,这使得它看起来像是一个时间问题。

这是在问题发生时调用的函数。

$scope.createThrottling = function (sources) {
            MYAPP.modals.Throttling('New', sources, API, function () {
                $scope.isLoading = true;

                $scope.$apply();


                API.Migrations.getThrottles({ id: jQuery.getUrlVar('id') }, function (data) {
                    $scope.Throttles = data.Throttles;
                    $scope.isLoading = false;

                    // THE PROBLEM IS RIGHT HERE

                });


            });
        }

上面的评论显示问题似乎源于何处。此时,在执行代码时,Angular应自动检查$scope.Throttling中的更改,然后相应地更改DOM,但是,出于某种原因,在IE 11中,首次访问页面时绑定没有发生。

页面的后续刷新会导致绑定工作,但这看起来很奇怪。好像在$scope.$apply()完成后需要API.Migrations.getThrottles,但是我不能这样做,因为Angular会抛出一个JS错误,说它已经消化了。

有些注意事项:

  1. 这只发生在IE
  2. 这只发生在第一次访问每个浏览器的页面时(我可以点击F5并尝试相同的东西,它会起作用)
  3. 是否会发生这种情况,因为我的API.Migrations.getThrottles调用是在完全在Angular之外的MYAPP.modals.Throttling模块的回调函数内?
  4. 当我尝试调试上面的JS函数时,一切正常,这看起来像是一个时间问题
  5. 任何帮助找出导致此错误的原因都将非常感激!

    由于

1 个答案:

答案 0 :(得分:3)

我想我找到了问题!我终于尝试在不使用调试器的情况下打印从DOM中的服务器返回的数据,我意识到API响应并没有给我回复新数据!它正在发送不再有效的缓存数据,这就是对象未显示在DOM中的原因。这也解释了为什么使用调试器是有效的,因为它强制每个API调用都不被缓存!

我通过在$resource { _: Date.now() }对象中添加params,在我的$resource中解决了这个问题。这会将_=1234567890附加到此$resource的所有GET调用,这会强制IE不缓存