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

Mat*_*zke 5 javascript internet-explorer angularjs

我最近在我们的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

                });


            });
        }
Run Code Online (Sandbox Code Playgroud)

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

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

有些事情需要注意:

  1. 这只发生在IE中
  2. 这只发生在浏览器每次加载第一次访问页面时(我可以点击F5并尝试相同的东西,它会起作用)
  3. 可能会发生这种情况,因为我的API.Migrations.getThrottles调用是在MYAPP.modals.Throttling完全在Angular之外的模块的回调函数中吗?
  4. 当我尝试调试上面的JS函数时,一切正常,这使它看起来像一个计时问题

任何帮助找出造成这个错误的原因将不胜感激!

谢谢

Qia*_* Li 6

作为参考,在这里找到了解决方案:http://www.oodlestechnologies.com/blogs/AngularJS-caching-issue-for-Internet-Explorer

$httpProvider.defaults.cache = false;
if (!$httpProvider.defaults.headers.get) {
    $httpProvider.defaults.headers.get = {};
}
$httpProvider.defaults.headers.get['If-Modified-Since'] = 'Thu, 01 Jan 1970 00:00:00 GMT';
Run Code Online (Sandbox Code Playgroud)


Mat*_*zke 3

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

我能够$resource通过在{ _: Date.now() }params$resource. 这会附加_=1234567890到所有 GET 调用中$resource,强制 IE 不缓存