IE 11角度范围返回函数而不是对象

时间:2016-11-06 11:18:38

标签: jquery angularjs internet-explorer-11

$scope.updateCart = function() {

    item = $scope.productData;

此代码段在IE 11中返回一个函数,而不是像在chrome上那样返回对象

导致以下$ http请求发送乱码数据。

使用https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js

上一个标题:IE 11 jquery'Argument not optional'错误

以下代码:

    dt = $.param({
            shopid: shop_id,
            mtd: method,
            item: item
        });

抛出以下错误:

TypeError: Argument not optional
   at add (https://code.jquery.com/jquery-1.9.1.js:7340:4)
   at buildParams (https://code.jquery.com/jquery-1.9.1.js:7392:3)
   at jQuery.param (https://code.jquery.com/jquery-1.9.1.js:7360:4)
   at $scope.updateBACart (http://127.0.0.1:6636/js/baCartNg.js?v=1478430971:104:3)
   at fn (Function code:2:216)
   at expensiveCheckFn (http://code.angularjs.org/1.5.5/angular.js:15485:11)
   at callback (http://code.angularjs.org/1.5.5/angular.js:25018:17)
   at Scope.prototype.$eval (http://code.angularjs.org/1.5.5/angular.js:17229:9)
   at Scope.prototype.$apply (http://code.angularjs.org/1.5.5/angular.js:17329:13)
   at Anonymous function (http://code.angularjs.org/1.5.5/angular.js:25023:17)

错误在IE 11中引发但在chrome

中没有引发

根据https://docs.angularjs.org/api/ng/service/ $ httpParamSerializerJQLike

我更改了代码:

    dt = $httpParamSerializerJQLike({
            shopid: shop_id,
            mtd: method,
            item: item
        });

现在代码不会抛出错误,但请求是

   item: %0Afunction+item()+%7B%0A++++%5Bnative+code%5D%0A%7D%0A
   mtd: add
   shopid: 1

而不是商品数据。

2 个答案:

答案 0 :(得分:1)

当然,您可以将变量item1命名为item,而不是function () { item = (2 + 2); // or some other value } ,现在可以使用...但是这并没有告诉您有关的信息。错误与您的原始代码。

真正的问题是您要分配全局变量而不是局部变量。当你使用:

var item

之前未使用item,您实际上正在分配全局变量window。在浏览器上下文中,全局范围是function () { window.item = (2 + 2); } 对象,因此上述内容等同于:

window.item

在Chrome中,没有问题:最初没有window,因此这项任务会创建它。但是,在IE11中,item已经具有item属性,并且只读!这意味着全局window.item变量的所有赋值都会被忽略,因此function () { var item = (2 + 2); // does NOT create a global item variable } 始终具有其原始函数值。

您的解决方案"通过使用不同的变量名来解决这个问题。更好,更强大,更有效的解决方案是使用本地范围的变量:

var

作为一种好的做法,请确保在声明新变量时总是使用"use strict",以避免意外创建全局变量。更好的是,向您的函数添加window指令,以便这些类型的赋值抛出错误而不是默默地忽略错误。

如果确实需要创建全局变量,请明确指定function () { window.globalItem = (2 + 2); } 对象本身的属性:

scipy.stats.multivariate_normal

答案 1 :(得分:0)

解决方案是item1 = $scope.productData;而不是item = $scope.productData;

出于某种原因,IE11将item设置为function item() { [native code] }