如何从$ rootScope变量设置$ scope值

时间:2013-09-16 19:57:50

标签: javascript node.js angularjs

我在file.jade文件中有以下代码附加到控制器,fileCtrl

file.jade

.....
label(for='id') Id: 
input(ng-model='form.id', name='id')
p
....

fileCtrl

...
  $scope.submitMain = function ( path ) {
      $http.post('/api/submitMain', $scope.form).
      success(function(data) {
        alert("Submit Main Data: " + data);
        $rootScope.id = data;
        $location.path(path);
      });
  };
....

路径指向file1.jade,它具有相同的id字段并且附加到file1Ctrl

file1.jade

.....
label(for='id') Id: 
input(ng-model='form.id', name='id')
p
....

file1Ctrl

$scope.form.id = $rootScope.id;

出于某种原因,在Filectrl中设置的$ rootScope id,不是在file1Ctrl中设置form.id值,即使两个地方的值都是正确的。

非常感谢任何帮助。

梅尔罗伊

1 个答案:

答案 0 :(得分:0)

正如SergeL所说,如果你想通过$ rootScope传递它,你需要做一个$ watch。 $ watch监视给定表达式的更改并在脚本发出时触发它,并且可以在任何范围内使用。

$rootScope.$watch('id', function(newVal, oldVal){
    if (newVal !== undefined) {
        $scope.form.id = newVal;
    }
});

请注意,手表会在启动时触发未定义的值,这就是为什么您可能需要检查以确保它在使用前具有值。


然而,使用$ rootScope可能不是你需要手表的最佳方式,而在你经常需要在控制器之间共享数据的大型项目中,你可能会在rootScope中输入大量内容,从而产生冲突非常现实的可能性更好的方法是使用服务来共享信息。

Angular中的服务是单例,它们只存在于一个实例中,这意味着如果两个控制器使用相同的服务,则它们共享相同的数据。您将定义一个用于共享数据的服务:

.factory('IdStorage', [function() {
    return {};
}])

这将创建一个基本上只是一个对象的服务,并且由于服务只存在于一个实例中,因此该对象将在使用该服务的任何对象之间共享。所以在你回调中你可以这样做:

IdStorage.id = data;

在控制器中你可以:

$scope.form.id = IdStorage;

由于它们都引用相同的对象(因为它是单例),它们总是相同的。由于IdStorage只是一个对象,如果你愿意,你可以在其中存储更多信息。而且,如果您需要在整个应用程序中共享不同的内容,则可以创建多个此类服务,您不会像在将所有内容转储到$ rootScope中那样存在冲突风险。