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 应用程序共享变量。

  1. 您可以使用嵌套控制器并在父控制器中共享变量。您将拥有 $scope.$parent.variable,但 angular 会为您完成此操作,您可以通过 $scope.variable 调用它。比所有子控制器将共享其父变量。 see angular ui router nesting
  2. 有存储共享变量的服务。在这种情况下,每次任何控制器发生变化时,您都需要有某种方法来更新服务变量。为此,您可以使用 $scope.$watch() 方法并针对每个 属性 更改更新您的服务模型。

我个人更喜欢第一种方法,因为绑定是在 angular 中完成的,并且可以为您节省一些服务方法所需的代码。

一个控制器"loop"停止的原因可能是因为你的控制器的$digest循环不是运行。 see more to understand how $digest cycle actually works