angularjs IE9范围变量变为未定义

时间:2014-08-07 23:35:05

标签: javascript angularjs internet-explorer

我在IE9上遇到了一个奇怪的问题。我要做的是从我的页面打开一个弹出窗口,并将页面范围附加到窗口对象,如:

angularApp.controller('ParentCtrl', function($scope, $window) {
    $window.parentScope = $scope;
    $window.open(url, popupName, params);
});

在我的弹出/子控制器中,我正在使用父作用域中的某些属性来填充数据。然后在我的弹出页面中,我有一些控件,允许用户从多选框中选择某些人。用户点击弹出页面中的Assign人员后,我正在我的父页面中调用一个方法,如:

childApp.controller('ChildCtrl', function($scope, $window) {
    $window.opener.parentScope.updatePersons($scope.personInfo);
}

方法updatePersons在ParentCtrl中定义为:

$scope.updatePersons = function(personInfo){
    $scope.$apply(function() {
        $scope.personInfo = personInfo;
    });
};

到目前为止一切正常,更新的personInfo数组从弹出窗口复制到父页面。现在,当我再次从父页面上的按钮打开弹出页面时,ParentCtrl中$ scope.personInfo的值神秘地设置为undefined。

父页面上的personInfo数组用于ng-repeat以显示具有其属性的人员的表格列表,在IE9中,我在表格的所有列中看到未定义。

显然,Safari,Firefox和Chrome都能完美运行,并且在再次单击弹出页面时不会将此范围变量的值设置为undefined。我试过寻找这个问题的解决方案,但都失败了。我已将id =“ng-app”放在我的应用程序的根目录中,并遵循angularJs项目页面上提到的一些IE警告,但没有任何成功。我非常感谢社区提供的任何帮助,因为它是我申请的阻止。

我创建了一个plunker来演示我想要实现的目标。不知何故,子页面不显示父作用域值,并且子程序无法更新父作用域,但是在我的应用程序中可以使用。

http://plnkr.co/edit/E5pzzYOCMXHTK1huCAF5?p=preview

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

在Chrome或IE中,plnkr示例并不适用于我。

由于某种原因,它试图将重复值放入转发器中。通过索引跟踪重复项目修复了我对示例的问题。

<div ng-repeat="person in personInfo track by $index">

编辑:澄清一下 - 在添加曲目后,plnkr在Chrome和模拟IE9(IE11模拟IE9)会话中都有效。

答案 1 :(得分:0)

我最终通过使用angular.copy将数据从父级发送到弹出窗口然后将popInup中的personInfo更新为父级来解决问题。它在某种程度上起作用,以至于当我再次点击弹出窗口时,personInfo对象没有设置为undefined。

但是当我从弹出窗口向父级接收更新数据时,我遇到了另一个问题。我的personInfo数组里面有两个嵌套的JS数组,当我从弹出窗口接收数组时,一切都很好,但是当我使用$ scope.personInfo = angular.copy(personInfo)将它分配给我的父作用域时,两个嵌套的JS数组在$内scope.personInfo转换为JS对象,长度方法没有对它们起作用。

我能解决这个问题的唯一方法是迭代每个人对象,然后检查是否有任何数组的长度属性未定义,然后使用jQuery的map函数将这些对象转换回JS数组。这是一个愚蠢的黑客,但如果有人知道它为什么会发生在IE上,以及最好的角度方式是什么,这将是真棒!

我仍然不明白为什么当所有其他浏览器看起来工作正常时,IE对阵列的处理方式不同。另外,为什么我必须在任何地方使用angular.copy让IE快乐!!!

谢谢!