Javascript AngularJS禁用双向绑定

Javascript AngularJS禁用双向绑定,javascript,angularjs,Javascript,Angularjs,这实际上可能是一个JavaScript问题,但在我使用AngularJs时就发生了 假设我有这样一个数组: var players = [ { id: 1, name: 'Player 1' }, { id: 2, name: 'Player 2' } ]; var teams = [ { id: 1, name: 'Team 1', memb

这实际上可能是一个JavaScript问题,但在我使用AngularJs时就发生了

假设我有这样一个数组:

var players = [
    {
        id: 1,
        name: 'Player 1'
    },
    {
        id: 2,
        name: 'Player 2'
    }
];
var teams = [
    {
        id: 1,
        name: 'Team 1',
        members: players
    },
    {
        id: 2,
        name: 'Team 2',
        members: players
    }
];
然后我有另一个类似这样的数组:

var players = [
    {
        id: 1,
        name: 'Player 1'
    },
    {
        id: 2,
        name: 'Player 2'
    }
];
var teams = [
    {
        id: 1,
        name: 'Team 1',
        members: players
    },
    {
        id: 2,
        name: 'Team 2',
        members: players
    }
];
如果我决定向其中一个团队添加名为position的新属性:

teams[0].members[0].position = 1;
我不想让它更新第二组成员的位置。 我希望这是有道理的

下面是一个代码笔来说明我的问题:

唯一的方法(如果两支球队拥有相同的球员)是为第二支球队使用阵列的副本。现在,第二个团队得到更新是合乎逻辑的,因为两个团队都指向相同的
玩家参考

你可以用它

var copyofplayers = [];
angular.copy(players, copyofplayers);
唯一的方法(如果两个团队拥有相同的玩家)是为第二个团队使用阵列的副本。现在,第二个团队得到更新是合乎逻辑的,因为两个团队都指向相同的
玩家参考

你可以用它

var copyofplayers = [];
angular.copy(players, copyofplayers);

java脚本中的数组是可变的,所以您需要制作播放器的副本并将其分配给团队成员属性

只需将代码更改为:

var teams = [
{
    id: 1,
    name: 'Team 1',
    members: angular.copy(players)
},
{
    id: 2,
    name: 'Team 2',
    members: angular.copy(players)
}
])


有关更多信息,请参阅:

java脚本中的数组是可变的,因此您需要制作播放器的副本并将其分配给团队成员属性

只需将代码更改为:

var teams = [
{
    id: 1,
    name: 'Team 1',
    members: angular.copy(players)
},
{
    id: 2,
    name: 'Team 2',
    members: angular.copy(players)
}
])

有关更多信息,请参见:

还可以像

也可以使用jQuery.extend()像



为什么两队都有相同的球员?这总是会发生的,因为两队的
成员都指向同一个对象!数据没有意义……如果您引用了相同的javascript对象,那么您永远不会以这种方式存储数据。实际上,您只在第0个索引中创建了新对象。结果来自您的输入。仅此而已。这是我放在一起的一个示例,在我的应用程序中,它是一个体育购物车,您为服装指定一个球员/球员编号,然后设置每个球员/服装的物品数量。但我发布的示例更容易解释:)为什么两个团队都有相同的玩家?这总是会发生,因为两个团队的
成员都指向同一个对象!数据没有意义……如果您引用了相同的javascript对象,那么您永远不会以这种方式存储数据。实际上,您只在第0个索引中创建了新对象。结果来自您的输入。仅此而已。这是我放在一起的一个示例,在我的应用程序中,它是一个体育购物车,您为服装指定一个球员/球员编号,然后设置每个球员/服装的物品数量。但是我发布的示例更容易解释:)或者,如果使用lodash,你可以
。.cloneDeep(players)
或者,如果使用lodash,你可以
。.cloneDeep(players)
我希望有一个更好的解决方案,在每个播放器中循环并为每个播放器创建一个新对象。当更改文本框上的值时,如何实现这一点?@ramesh您的意思是在对象模型更改时复制绑定到文本框的对象?是的,您需要使用
scope.watch()
。我希望有一个更好的解决方案,那就是必须在每个玩家之间循环,并为每个玩家创建一个新对象。当更改文本框上的值时,如何实现这一点?@ramesh您的意思是在模型更改时复制绑定到文本框的对象?是的,您需要使用
scope.watch()
。是的,但我没有将jQuery与AngularJs一起使用是的,但我没有将jQuery与AngularJs一起使用