我在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值,即使两个地方的值都是正确的。
非常感谢任何帮助。
梅尔罗伊
答案 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中那样存在冲突风险。