【问题标题】:Cannot delete Javascript object and make fresh instance in angular js scope无法删除 Javascript 对象并在 Angular js 范围内创建新实例
【发布时间】:2017-05-23 18:41:39
【问题描述】:

我在创建 JavaScript 对象的新副本并分配给 $scope 时遇到了一个奇怪的问题。这个对象绑定到前端表单,所以我必须重置这个对象的数据。这是代码: 这是 JavaScript 类:

var userInfo = (function () {
  function userInfo() {}

  var _refCode = "";
  var _country = {};
  var _language = {};
  var _userType = 0;
  var _retailer = {};

  userInfo.prototype.data = {
    refCode: function (value) {
      return angular.isDefined(value)
        ? (_refCode = value)
        : _refCode;
    },
    country: function (value) {
      return angular.isDefined(value)
        ? (_country = value)
        : _country;
    },
    language: function (value) {
      return angular.isDefined(value)
        ? (_language = value)
        : _language;
    },
    userType: function (value) {
      return angular.isDefined(value)
        ? (_userType = value)
        : _userType;
    },
    retailer: function (value) {
      return angular.isDefined(value)
        ? (_retailer = value)
        : _retailer;
    }
  }

  return userInfo;
})();

这是我的角度控制器:

app.controller('MainController', function ($scope, $http, $state) {
  $scope.initUserInfo = function () {

    //here make instance of the class
    var user_info = new userInfo();

    delete $scope.userInfo;
    $scope.userInfo = user_info;
  };

  $scope.initUserInfo();
});

但是当我调用函数initUserInfo() 时,什么也没有发生。 $scope.userInfo 中的数据还在。我做错了什么以及如何从userInfo 中删除信息?

更新:

谢谢,我进行了更改,现在我的代码看起来像,但是当我

控制台日志

我有以下错误:

无法读取未定义的属性“数据” - 在第一个 console.log 上

打印旧值 - 在第二个 console.log 上

打印旧值 - 在第三个 console.log 上

-在执行此功能后,在她的表演之前仍然没有被删除。

   $scope.initUserInfo = function () {
    delete $scope.userInfo;
    var user_info = null;
    console.log("after delete: " + $scope.userInfo.data.refCode());//first console log
    user_info = new userInfo();
    $scope.userInfo = user_info;
    console.log("after assing: " + $scope.userInfo.data.refCode());
    $scope.userInfo.data.createdStore(new addStoreData());
    $scope.userInfo.merge(verifiedEmployee);
    $scope.verifiedEmployee = verifiedEmployee;
    console.log($scope.userInfo.data.refCode());
    };

【问题讨论】:

  • 为什么不像 $scope.userInfo= {} ??
  • @ManuelObregozo 并尝试过,但没有成功

标签: javascript angularjs


【解决方案1】:

嗯,在我看来,一切正常。 data 属性将在new userInfo() 构造的每个对象中设置。因为你在prototype中设置了这个属性。

所以,这就是您的代码的作用:

  • 1) 您创建了userInfo() 的新实例,并将其保存在user_info 中。现在user_info 拥有data 属性。
  • 2) 您删除了 $scope 对象的属性 userInfo,无论它是什么。现在$scope.userInfo 是undefined。但是源函数userInfo 仍然存在,因为你没有删除它。此外,您实际上无法使用 delete 关键字删除它,因为您使用 var 关键字创建了它(而它变得不可配置)。更多关于delete operator
  • 3) 您将$scope 对象的userInfo 属性重新分配给之前创建的(当然仍然存在)user_info,它是源userInfo 的一个实例,并且具有data 属性。所以现在$scope.userInfo 有了 data 属性。

总的来说,如果您想删除$scope.userInfo 中的信息,那么您做对了:delete $scope.userInfo。如果要删除originuserInfo函数中的信息,可以这样做,例如:userInfo = null。

这里是 plunker 和您的代码。

【讨论】:

  • 添加注意$scope.apply()函数!
  • @GProst 我做了一些更改,这是我的最终代码,但问题没有解决。
猜你喜欢
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2012-02-27
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多