angularjs-共享服务';在两个控制器之间交换数据

angularjs-共享服务';在两个控制器之间交换数据,angularjs,service,controller,scope,Angularjs,Service,Controller,Scope,我是新手。我有一个小程序,可以显示姓名列表。我使用listController管理列表的显示,使用editController提交更多名称,或将列表重置为初始状态。我在由两个控制器访问的服务中持有名称列表 问题是当editController重置列表时,listController仍然不知道它。我一直在绞尽脑汁想这个问题,如果有人能快速看一下,看看问题是什么,我会很感激的 人员名单 {{person.firstName}{{person.lastName}} 添加新人员 名字 姓 拯

我是新手。我有一个小程序,可以显示姓名列表。我使用
listController
管理列表的显示,使用
editController
提交更多名称,或将列表重置为初始状态。我在由两个控制器访问的服务中持有名称列表

问题是当
editController
重置列表时,
listController
仍然不知道它。我一直在绞尽脑汁想这个问题,如果有人能快速看一下,看看问题是什么,我会很感激的


人员名单
  • {{person.firstName}{{person.lastName}}
添加新人员 名字 姓 拯救 重置
好的,代码就是这样运行的

  • MyFactory服务被初始化并创建一个列表数据,我们称之为列表1
  • MainCtrl被初始化并获取list1数据
  • EditorCtrl已初始化
  • 输入一些数据并保存数据,这将被放入列表1
  • 按reset,重新创建列表,服务中不再引用列表1。。现在我们有了清单2
  • 输入一些数据并保存数据,这将被放入列表2中
  • 但是,MainCtrl仍然有list1的数据,因此它不会更新

    关键的重要性在于数组是作为引用而不是值传递的,因此,如果希望数组在应用程序中按应有的方式运行,则不要破坏数组,这一点很重要

    重置列表时,它会重新创建数组并丢弃其现有引用,但mainCtrl中的引用仍然是旧引用

    //this will recreate the array
    list = [{
      firstName: 'Rachel',
      lastName: 'Washington'
    }, {
      firstName: 'Joshua',
      lastName: 'Foster'
    }, {
      firstName: 'Samuel',
      lastName: 'Walker'
    }, {
      firstName: 'Phyllis',
      lastName: 'Reynolds'
    }];
    
    所以重要的是你不要这样做,把它改成

    var data = [{
      firstName: 'Rachel',
      lastName: 'Washington'
    }, {
      firstName: 'Joshua',
      lastName: 'Foster'
    }, {
      firstName: 'Samuel',
      lastName: 'Walker'
    }, {
      firstName: 'Phyllis',
      lastName: 'Reynolds'
    }];
    list.length = 0;
    angular.forEach(data, function(val){
      list.push(val);
    })
    
    通过这种方式,您不会重新创建数组,请注意没有“list=something”

    list.length = 0; //removes all items but does not remove the reference
    
    移除项目后,可以重新填充

    请记住,还应将列表变量初始化为数组

    var list = [];
    

    对于javascript来说,使用“list.length=0”保存对数组的引用听起来似乎微不足道。但是哇,这是一件大事。吸取教训!谢谢