查看各处但在当前控制器中的更新 - angularJS

时间:2014-09-10 13:21:13

标签: angularjs data-binding angularjs-directive

编辑:如我所知,我会更有效地解释一下!

我最近一直坐在一个恼人的问题面前,这就是每当我更新一个指令内的值时,控制器我当前都没有"在"是唯一可以正确更新的。

场景示例:“配置文件”页面由两个控制器组成。 Navbar_controller,它当前只显示用户名:

<div ng-if="Auth.isAuthenticated">Hello, {{Auth.getCurrentUser().name}}</div>

第二个控制器,Profile_controller用于更新用户值。这是角度第一控制器中的一个简单功能,它更新了CurrentUser:

$scope.updateUser = function (type, form) {
    if (!$scope.modif)
        return ;

    $http.put('/api/users/' + Auth.getCurrentUser()._id + '/update', {type:type, modif:$scope.modif})
          .success(function (data, status) {
                $scope.user = Auth.setNewUser(data);
            })
            .error(function () {
                console.log("error");
            });
    };

例如,当我更新名称时。我可以看到数据库已被正确修改。实际上,navbar_controller得到了更新,因为在div中打印了一个新名称。但是,Profile_controller无法获得更新:个人资料页面中打印的名称无法更改。

以下是Auth.service.js中的两个基本功能:

getCurrentUser: function() {
    return currentUser;
  },

// 'user' is the data retrieved in http put request dot success
setNewUser: function(user) {
      currentUser = user;
      $rootScope.$broadcast(); // Navbar_controller is updated with or without this line
      return currentUser;
  }

无论如何,如果我查看导航栏及其控制器(调用Auth.getCurrentUser()方法),则会立即修改用户值。我一直在使用一种丑陋的方法,包括手动修改控制器值或刷新页面......但这不是一条路,对吧?

必须有&#34; $ rootScope。$ broadcast();&#34;,但我对Angular很新,而stackoverflow上的其他问题太具体了,无法帮助我理解。< / p>

谢谢!

2 个答案:

答案 0 :(得分:0)

您的问题有点难以理解,但我认为问题在于您在各种控制器中引用了一个不断变化的对象。这是一个解释的例子:

服务:

var myObject = { ... };
return { 
    getObject() { return myObject; }
    setObject(obj) { myObject = obj; }
};

控制器1:

$scope.myObjA = Service.getObject();

控制器2:

$scope.myObjB = Service.getObject();

现在初始化时,两个控制器都将引用相同的对象,因此如果您更改了任一控制器内的属性(例如$scope.myObjB.name = 'bob';),那么另一个控制器也会看到该名称。

但是,如果您在控制器中更改了对象本身(例如Service.setObject(newObj);),则控制器将引用新对象,而另一个控制器仍将引用旧对象。

您可以通过将服务对象包装在容器中来解决此问题:

var cont = {
    user: ...
};

function getContainer() { return cont; }

function setNewUser(user) { cont.user = user; }

然后在你的控制器内,获取容器(而不是用户):

$scope.cont = Service.getContainer();

在你的HTML中:

<div>{{cont.user.name}}</div>

现在,当您更新用户时,将更新所有连接的控制器。

答案 1 :(得分:0)

好吧,我会尝试在$ rootScope中更改和存储用户信息,因为您的场景可能非常合适。

getCurrentUser: function() {
   $rootScope.currentUser===undefined ? 'no User': $rootScope.currentUser;
  },

setNewUser: function(user) {
      $rootScope.currentUser = user;
      //$rootScope.$broadcast(); no need to broadcast
      return getCurrentUser();
  }

以这种方式,currentUser将根据需要在不同的范围内更新!

我将引用AnuglarJs FAQ关于$ rootscope:

$ rootScope存在,但它可以用于邪恶

  

偶尔会有一些您想要全局化的数据   整个应用程序。对于这些,您可以注入$ rootScope并设置值   它像任何其他范围。由于范围继承自根范围,   这些值可用于附加的表达式   像ng-show这样的指令就像本地$ scope的值一样。

     

当然,全球状态很糟糕,你应该谨慎使用$ rootScope,   就像你希望用任何语言的全局变量一样。   特别是,不要将它用于代码,只用于数据。如果你很想   把一个函数放在$ rootScope上,把它放在一个几乎总是更好   可以在需要的地方注入,更容易注入的服务   测试

     

相反,不要创建一个生活中唯一目的的服务   存储并返回数据位。