【问题标题】:Unexpected change in a model when using Angular ui-select使用 Angular ui-select 时模型发生意外变化
【发布时间】:2015-11-24 21:17:14
【问题描述】:

我有一个 Angular 用户界面选择,用于根据所选选项切换一些复选框(使用 ng-repeat 生成)。

复选框也可以手动切换,这就是问题所在。

场景如下:

  1. 选择一个选项。某些复选框是根据$scope.recipes.available 模型上指定选项的ingredients 属性切换的。
  2. 手动切换一个额外的复选框。
  3. 选择不同的选项。相应的复选框已正确切换。
  4. 切换回第一个选择的选项。除了切换最初在 ingredients 属性上指定的复选框之外,还切换了手动修改的复选框。在调试时,我发现 ingredients 属性已被修改。

这个plunkr 说明了这个问题。

到目前为止,在阅读了无数范围界定问题(我是 Angular 新手)并一次又一次地尝试重构我的代码之后,我无法解决这个问题。

在继续尝试再次重构代码之前,我想了解这里发生了什么。

为什么要修改ingredients 属性?

【问题讨论】:

    标签: javascript angularjs ui-select


    【解决方案1】:

    您的 bundles 数组正在您的 toggleBundleSelection 函数中更新。当配方选择发生变化时,没有任何东西可以重置数组。由于 bundles 在 $scope 上,因此值会在控制器实例的生命周期内保留。

    【讨论】:

    • 当食谱改变时,我会$scope.bundles.selected = $scope.recipes.available[$selectedRecipe].ingredients;。不应该重置$scope.bundles.selected吗?
    • 啊,错过了。您不应该将一个数组分配给另一个数组。您将希望将其设置为等于这样的副本: $scope.bundles.selected = angular.copy($scope.recipes.available[$selectedRecipe].ingredients);
    • 这确实有效(谢谢!),但我仍然不明白为什么有必要。我将成分的内容分配给$scope.bundles.selected,而不是相反...
    • 使用赋值运算符,实际上只是引用原始数组。数组是引用类型。这意味着,它们实际上并不存储值,它们只存储对这些值的引用。您所做的是复制对内存位置的引用,这意味着对该位置的内存的任何更改(包括删除元素)都将是反映在两个数组中。
    • 这是有道理的。非常感谢您的解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 2017-11-25
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多