【问题标题】:AngularJS unbind equivalent variablesAngularJS 取消绑定等效变量
【发布时间】:2014-01-12 05:29:51
【问题描述】:

处理一个表单,让用户根据 $rootScope(也可以是 $scope)上的一个变量来编辑他们的详细信息。

$rootScope.formData = $rootScope.user;

在视图中,输入上有一个ng-model:

 ng-model="formData.email"

我期望的行为是更新模型,只有 $rootScope.formData 会更新,但两者都会更新。

有没有办法打破两者的关系?

【问题讨论】:

  • 这里的期望是错误的。 user 是一个参考。 JS 中的对象作为引用传递。就是这样。您可以随时调用 clone 或 cloneDeep(例如 lo-dash)。我建议根据 JS 行为是通过引用传递这一事实重新考虑您的设计
  • 你是对的,文档给出了这个确切的场景作为 angular.copy() 的示例。如果您将此作为答案,我会将其标记为这样。我所要做的就是在该方法中包装第二个 var。谢谢。 docs.angularjs.org/api/angular.copy

标签: javascript angularjs scope


【解决方案1】:

正如 cmets 中所讨论的,我们正在使用 JS 引用。这意味着,我们将 user 作为引用传递给另一个 (root) 范围

我们可以调用angular.copy()cloneDeep()(参见lo-dash)来处理新实例

【讨论】:

    【解决方案2】:

    问题是您将一个对象设置为另一个对象。在 Javascript 中,对象是通过引用传递的,因此您实际上将 $rootScope.formData 设为了指向 $rootScope.user 的指针。这就是为什么更新一个会更新另一个。

    您可以$rootScope.user = null;,这实际上会删除引用,但您会丢失它最初拥有的引用。如果不需要,我想您可以将 user 对象克隆到 formData 中,如果您没有提供此功能的库,这本身就是一项壮举。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      相关资源
      最近更新 更多