Javascript 使用Angular ui select时模型中发生意外更改

Javascript 使用Angular ui select时模型中发生意外更改,javascript,angularjs,ui-select,Javascript,Angularjs,Ui Select,我有一个角度ui选择,用于根据所选选项切换一些复选框(使用ng repeat生成) 复选框也可以手动切换,这就是出现问题的地方 情况如下: 选择一个选项。根据$scope.recipes.available模型上指定选项的成分属性切换某些复选框 手动切换其他复选框 在“选择”选项卡上选择其他选项。相应的复选框已正确切换 切换回第一个选定的选项。除了切换最初在成分属性上指定的复选框外,还切换手动修改的复选框。调试时,我看到成分属性被修改了 这说明了问题所在 到目前为止,在阅读了无数的范围问题(我是

我有一个角度ui选择,用于根据所选选项切换一些复选框(使用
ng repeat
生成)

复选框也可以手动切换,这就是出现问题的地方

情况如下:

  • 选择一个选项。根据
    $scope.recipes.available
    模型上指定选项的
    成分
    属性切换某些复选框
  • 手动切换其他复选框
  • 在“选择”选项卡上选择其他选项。相应的复选框已正确切换
  • 切换回第一个选定的选项。除了切换最初在
    成分
    属性上指定的复选框外,还切换手动修改的复选框。调试时,我看到
    成分
    属性被修改了
  • 这说明了问题所在

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

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


    为什么要修改
    成分
    属性?

    您的bundles数组正在toggleBundleSelection函数中更新。当配方选择更改时,不会重置数组。由于bundles位于$scope上,因此在控制器实例的生命周期内保留这些值。

    当配方更改时,我会执行
    $scope.bundles.selected=$scope.recipes.available[$selectedRecipe].components。这不应该重置
    $scope.bundles.selected
    ?啊,错过了。您不应该将一个数组分配给另一个数组。您需要将其设置为如下副本:$scope.bundles.selected=angular.copy($scope.recipes.available[$selectedRecipe].components);这确实有效(谢谢!),但我仍然不明白为什么有必要这样做。我正在将配料的内容分配给
    $scope.bundles.selected
    ,而不是反过来……使用赋值运算符,实际上您只是引用原始数组。数组是引用类型。这意味着,它们实际上不存储值,它们只存储对这些值的引用。您所做的是将引用复制到内存位置,这意味着对该位置内存的任何更改(包括删除元素)都将反映在两个数组中。这是有意义的。非常感谢您的解释!