AngularJS 如何将来自一个网站的一个 运行 两个控制器更改其中之一
AngularJS How would one run two controllers from one website, and have one of them change
问题
我正在尝试纠正 AngularJS 网页,并且我在控制器中存储了变量。该控制器绑定到第一个选项卡。我希望能够从第二个选项卡(带有自己的控制器)访问属于该控制器的变量(并保持循环 运行ning)。当我更改选项卡时,它会失去第一个控制器的焦点,并在我切换回它时重置变量。
可能的修复?
有一个主控制器 运行 跨越所有选项卡,并有 运行 循环并存储所有重要变量。然后让单个选项卡的控制器从该控制器访问 methods/variables。
您为什么不使用服务并将此服务注入您的 2 个控制器?
然后每个控制器都可以访问服务并共享相同的变量。
也许 fiddle 有帮助?
$rootScope 似乎是这里最简单的修复方法。添加 $rootScope 作为依赖项,然后将数据分配给它。
某事 link 这个:
angular.module('app').controller('Controller1', function($rootScope, $scope) {
$scope.root = $rootScope;
// Test data
$rootScope.something = $rootScope.something || "really important";
});
angular.module('app').controller('Controller2', function($rootScope, $scope) {
$scope.root = $rootScope;
// Test data
$rootScope.something = $rootScope.something || "even better!";
});
如果感觉 "hacky",那么它有点像。这是学习和使用 service.
的重要理由
'use strict';
/**
* Simple Service to hold my stuff.
*/
angular.module('app').factory('Stuff', function() {
// This is the Stuff object.
// The factory makes stuff as a service when AngularJS starts up.
// Whenever you put 'Stuff' as a Dependency, Angular will use the first one it made.
// So all your controllers share the same Stuff object.
var stuff = {
// We're just going to keep one thing.
justOneThing: null
};
// These are example functions. A getter and a setter
// You could get stuff.justOneThing directly, or use functions
// Or write anything you like.
stuff.set = function(value) {
return stuff.justOneThing = value;
};
stuff.get = function() {
return stuff.justOneThing;
}
// This returns the Stuff object. I like this pattern for services
// and use it alot. It's easy for me to see what the factory made
// and what the service is doing. THere's other options!
return stuff;
});
首先有趣的是为什么要使用循环来更新变量? use $watch()
一般来说,有几种方法可以跨 angular 应用程序共享变量。
- 您可以使用嵌套控制器并在父控制器中共享变量。您将拥有 $scope.$parent.variable,但 angular 会为您完成此操作,您可以通过 $scope.variable 调用它。比所有子控制器将共享其父变量。 see angular ui router nesting
- 有存储共享变量的服务。在这种情况下,每次任何控制器发生变化时,您都需要有某种方法来更新服务变量。为此,您可以使用 $scope.$watch() 方法并针对每个 属性 更改更新您的服务模型。
我个人更喜欢第一种方法,因为绑定是在 angular 中完成的,并且可以为您节省一些服务方法所需的代码。
一个控制器"loop"停止的原因可能是因为你的控制器的$digest循环不是运行。 see more to understand how $digest cycle actually works
问题
我正在尝试纠正 AngularJS 网页,并且我在控制器中存储了变量。该控制器绑定到第一个选项卡。我希望能够从第二个选项卡(带有自己的控制器)访问属于该控制器的变量(并保持循环 运行ning)。当我更改选项卡时,它会失去第一个控制器的焦点,并在我切换回它时重置变量。
可能的修复?
有一个主控制器 运行 跨越所有选项卡,并有 运行 循环并存储所有重要变量。然后让单个选项卡的控制器从该控制器访问 methods/variables。
您为什么不使用服务并将此服务注入您的 2 个控制器? 然后每个控制器都可以访问服务并共享相同的变量。
也许 fiddle 有帮助?
$rootScope 似乎是这里最简单的修复方法。添加 $rootScope 作为依赖项,然后将数据分配给它。
某事 link 这个:
angular.module('app').controller('Controller1', function($rootScope, $scope) {
$scope.root = $rootScope;
// Test data
$rootScope.something = $rootScope.something || "really important";
});
angular.module('app').controller('Controller2', function($rootScope, $scope) {
$scope.root = $rootScope;
// Test data
$rootScope.something = $rootScope.something || "even better!";
});
如果感觉 "hacky",那么它有点像。这是学习和使用 service.
的重要理由'use strict';
/**
* Simple Service to hold my stuff.
*/
angular.module('app').factory('Stuff', function() {
// This is the Stuff object.
// The factory makes stuff as a service when AngularJS starts up.
// Whenever you put 'Stuff' as a Dependency, Angular will use the first one it made.
// So all your controllers share the same Stuff object.
var stuff = {
// We're just going to keep one thing.
justOneThing: null
};
// These are example functions. A getter and a setter
// You could get stuff.justOneThing directly, or use functions
// Or write anything you like.
stuff.set = function(value) {
return stuff.justOneThing = value;
};
stuff.get = function() {
return stuff.justOneThing;
}
// This returns the Stuff object. I like this pattern for services
// and use it alot. It's easy for me to see what the factory made
// and what the service is doing. THere's other options!
return stuff;
});
首先有趣的是为什么要使用循环来更新变量? use $watch()
一般来说,有几种方法可以跨 angular 应用程序共享变量。
- 您可以使用嵌套控制器并在父控制器中共享变量。您将拥有 $scope.$parent.variable,但 angular 会为您完成此操作,您可以通过 $scope.variable 调用它。比所有子控制器将共享其父变量。 see angular ui router nesting
- 有存储共享变量的服务。在这种情况下,每次任何控制器发生变化时,您都需要有某种方法来更新服务变量。为此,您可以使用 $scope.$watch() 方法并针对每个 属性 更改更新您的服务模型。
我个人更喜欢第一种方法,因为绑定是在 angular 中完成的,并且可以为您节省一些服务方法所需的代码。
一个控制器"loop"停止的原因可能是因为你的控制器的$digest循环不是运行。 see more to understand how $digest cycle actually works