1

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

文件.jade

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

文件Ctrl

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

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

文件1.jade

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

文件1Ctrl

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

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

非常感谢任何帮助。

梅尔罗伊

4

1 回答 1

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 中那样冒着冲突的风险。

于 2013-09-16T20:41:05.993 回答