如何解决这个Javascript变量引用混乱

如何解决这个Javascript变量引用混乱,javascript,angularjs,coffeescript,Javascript,Angularjs,Coffeescript,因此,我面临的问题是: app.controller 'MainCtrl', ($scope, TestData) -> $scope.name = 'World' TestData.get(0).then (data)-> $scope.elem = data TestData.get(1).then (data)-> $scope.elem2 = data $scope.callFunc = -> TestData.mod

因此,我面临的问题是:

app.controller 'MainCtrl', ($scope, TestData) ->
  $scope.name = 'World'
  TestData.get(0).then (data)->
    $scope.elem = data  
  TestData.get(1).then (data)->
    $scope.elem2 = data

  $scope.callFunc = ->
    TestData.modify1()
    TestData.modify2()

app.factory 'TestData', ($q,$timeout)->

  data = [{
    name: "TestData #1"
    id: 1
  },{
    name: "TestData #2"
    id: 2
  }]


  funcs = {}

  funcs.get = (id)->
    deferred = $q.defer()
    $timeout(->
      deferred.resolve(data[id])  
    ,500)
    return deferred.promise

  funcs.modify1 = ->
    data[0].name = "DataTest #1"

  funcs.modify2 = ->
    data[1] = {
      name: "DataTest #2"
      id
    }

  return funcs
我不知道如何解决这个问题,但我想更新数组中的一个元素。我明白更换它是行不通的。但是我该怎么做呢

如果只是name/id,那就不会有问题。但是实际的模型有很多不同的数据,我不想单独更新它们

以下是一个plnkr,展示了问题(如果有帮助):


(我确实理解为什么它不起作用的背后的理论,我主要是在寻找解决这个问题的最有效的方法。)

要将对象
in
的所有属性复制到对象
out
,您可以执行以下操作:

for k of in
  out[k] = in[k]
我不确定你到底在做什么(不太熟悉Angular),但你可能会在这里得到一些想法:


使用angular.extend覆盖旧对象中的属性如何?数据来自我的服务器API。如果它在服务器上发生更改,我会告诉客户机重新加载它,然后它会重新加载,但它会断开引用。我试图避免这种情况,因为它使我的实现过于复杂。
$scope.callFunc = ->
  TestData.modify $scope.elem, 0
  TestData.modifyAlt $scope.elem2, 1

...


funcs.modify = (incoming,i)->
  console.log "incoming:",incoming
  for k of incoming
    data[i][k] = incoming[k]

funcs.modifyAlt = (outgoing,i)->
  console.log "data[i]:",data[i]
  for k of data[i]
    outgoing[k] = data[i][k]