Angularjs 在某些情况下会丢失子数据

Angularjs 在某些情况下会丢失子数据,angularjs,angular-ui-bootstrap,Angularjs,Angular Ui Bootstrap,我遇到了一个问题,当我简单地console.log($scope.visitors)我的数据很好,但是当我console.log($scope.visitors)然后尝试打开AngularUI引导对话框时,$scope.visitors.optionalFields对象是空的 现在,我花了一些时间试图在jsbin中复制这个问题,但我没能让它发生,所以可能很难回答;只是希望有人知道是什么引起的 所以我有一个像这样的对象数组: $scope.visitors = [ { co

我遇到了一个问题,当我简单地
console.log($scope.visitors)
我的数据很好,但是当我
console.log($scope.visitors)
然后尝试打开AngularUI引导对话框时,
$scope.visitors.optionalFields
对象是空的

现在,我花了一些时间试图在jsbin中复制这个问题,但我没能让它发生,所以可能很难回答;只是希望有人知道是什么引起的

所以我有一个像这样的对象数组:

$scope.visitors = [
    {
        company:"one",
        optionalFields: {
            passportNumber:"ppt",
            contactNumber:"tel",
            licensePlate:"1234"
        },
        firstName:"some",
        lastName:"guy",
    }
]
$scope.editVisitorDialog = function (visitor) {
    console.log($scope.visitors);
    console.log(visitor);
}
I
ng在访问者中使用
visitor重复这些操作
,每个操作都有一个带有
ng click=“editVisitorDialog(visitor)”的按钮

现在,如果我使editVisitorDialog如下:

$scope.visitors = [
    {
        company:"one",
        optionalFields: {
            passportNumber:"ppt",
            contactNumber:"tel",
            licensePlate:"1234"
        },
        firstName:"some",
        lastName:"guy",
    }
]
$scope.editVisitorDialog = function (visitor) {
    console.log($scope.visitors);
    console.log(visitor);
}
然后
$scope.visitors
visitor
看起来都不错,它们都有自己的所有属性

但是,如果我只是简单地添加到此函数(即,日志调用仍然位于函数的顶部),则
$scope.visitors
中的每个访问者将有一个空的
optionalFields
对象

$scope.editVisitorDialog = function (visitor) {
    console.log($scope.visitors); // missing the optionalFields items
    console.log(visitor); // missing the optionalFields items

    var modalInstance = $modal.open({
        templateUrl: 'app/checkin/edit_visitor/edit_visitor.html',
        controller: EditVisitorController,
        resolve: {
            visitor: function () {
                return visitor;
            }
        }
    });

    modalInstance.result.then(function (result) {
        console.log(result)
    }, function () {
    });
}

当您使用对象调用
console.log()
时,它实际上不会记录对象。它很像一个检查工具,您可以看到当前的状态,而不是调用
console.log()
时的状态

请尝试
console.log(visitor.optionalFields.passportNumber)
,我保证它会记录“ppt”(在您的示例中)


这反过来意味着添加的代码中的某些可选字段丢失。

在$scope.visitors对象上设置$watch,使用true for
objectEquality
可以找到修改该对象的代码段。这就导致了问题。我在模态对话框中重置了一些字段,但由于模态实际上不是一个新窗口,只是一个新窗口的外观,它继承了父控制器的作用域,因此我重置了父控制器中的值。