Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用IE11和AngularJS的双向数据绑定问题_Javascript_Angularjs_Internet Explorer - Fatal编程技术网

Javascript 使用IE11和AngularJS的双向数据绑定问题

Javascript 使用IE11和AngularJS的双向数据绑定问题,javascript,angularjs,internet-explorer,Javascript,Angularjs,Internet Explorer,我最近在我们的web应用程序上构建了一个使用AngularJS的功能,我在IE 11中遇到了一些问题,没有正确地$apply()ing数据更改到DOM。由于某些原因,这只是偶尔发生,而在我尝试调试问题时从未发生,这使问题看起来像是一个时间问题 下面是出现问题时调用的函数 $scope.createThrottling = function (sources) { MYAPP.modals.Throttling('New', sources, API, function (

我最近在我们的web应用程序上构建了一个使用AngularJS的功能,我在IE 11中遇到了一些问题,没有正确地
$apply()
ing数据更改到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中的某些原因,在第一次访问页面时,绑定没有发生

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

需要注意的一些事项:

  • 这只发生在IE中
  • 这只发生在每次加载浏览器时第一次访问一个页面时(我可以点击F5并尝试相同的操作,它会工作)
  • 这可能是因为my
    API.Migrations.getThrottles
    调用位于MYAPP.modals.Throttling模块的回调函数内部,而该模块位于外部
  • 当我试着调试上面的JS函数时,一切正常,这似乎是一个时间问题
  • 如果您能帮助我们找出导致此错误的原因,我们将不胜感激


    谢谢

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


    我可以通过在我的
    $resource
    中的
    {{uu:Date.now()}
    参数中添加
    来解决
    $resource
    中的这个问题。这会将
    \uu=1234567890
    附加到该
    $resource
    的所有GET调用,该调用会强制IE不缓存对于参考,请在此处找到解决方案:


    尝试将
    $scope.$apply
    调用移动到getThrottles回调中,这就是我尝试的。我在上面提到过,这样做会导致抛出一个错误,表示它已经在消化我尝试使用
    jQuery.on('throttleComplete',…
    jQuery.trigger('throttleComplete'))
    要触发回调而不是实际使用回调,这没有任何帮助您是否从
    中删除了
    $scope.$apply
    调用。限制
    回调并将其仅放在getThrottles回调中实际上我甚至不需要console.log()…如果我打开了调试器,那么它就可以工作了…我一点也不困惑这个答案非常准确。非常感谢…我花了一整天的时间来解决这个问题,最后的罪魁祸首是缓存。
    
    $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';