【问题标题】:Passing variables between controllers using AngularJS使用 AngularJS 在控制器之间传递变量
【发布时间】:2016-04-27 03:40:56
【问题描述】:

我有两个控制器:Controller1 和 Controller2

在 Controller1 的 $scope 中,我已经设置了我需要的所有值。使用$scope 中的数据,我正在尝试运行某些函数并将返回值传递给Controller2。

我正在考虑创建一个工厂以将变量从 Controller1 传递到 Controller2。但是,我意识到我需要的所有输入值都存在于控制器 1 中。我想知道工厂是否可以在控制器 1 中运行时持久保存数据,并在控制器 2 中再次运行时返回该数据。

谢谢

【问题讨论】:

  • 请 - 添加代码以显示您已经完成的工作
  • 没什么可展示的,因为我还在证明这个概念。无论这是否合理,我都在寻找答案。
  • 如果你想传输数据,service 就可以了。 Take a look
  • 有很多不同的场景会改变实现。我们需要更多细节。

标签: javascript angularjs


【解决方案1】:

Factory 是一个单例,因此它可以用于在不同的控制器或指令之间共享数据。看看提琴手here。我创建了一个工厂“sharedContext”,可用于在使用不同 $scope 的控制器之间共享任何键值对。

工厂

myApp.factory("sharedContext", function() {
  var context = [];
  var addData = function(key, value) {
    var data = {
      key: key,
      value: value
    };
    context.push(data);
  }
  var getData = function(key) {
    var data = _.find(context, {
      key: key
    });
    return data;
  }

  return {
    addData: addData,
    getData: getData
  }
});

从需要共享对象的控制器可以调用工厂的'addData'方法将数据存储在一个键下。其他有兴趣访问共享数据的控制器/指令可以通过调用“getData”方法并传递正确的密钥来实现。

控制器(共享数据)

function MyCtrl_1($scope, sharedContext) {
  $scope.input_1 = 5;
  $scope.input_2 = 15;

  $scope.add = function() {
    $scope.result = $scope.input_1 + $scope.input_2;
    sharedContext.addData("Result", $scope.result)
  }
}

控制器(访问共享数据)

function MyCtrl_2($scope, sharedContext) {
  $scope.getData = function() {
    $scope.result = sharedContext.getData("Result").value;
  }
}

这里唯一的假设是两个控制器都需要使用确切的密钥来共享数据。为了简化流程,您可以使用常量提供者来共享密钥。另请注意,我使用 underscore.js 在共享上下文字典中查找键。

【讨论】:

    【解决方案2】:

    这是您能想到的最简单的解决方案。正如你所看到的,工厂是一个简单的对象,由于这个结构,它是通过引用而不是通过值传递的,这意味着在两个控制器中 dataFactory 是相同的

    http://plnkr.co/edit/eB4g4SZyfcJrCQzqIieD?p=preview

    var app = angular.module('plunker', []);
    app.controller('ControllerOne', function (dataFactory) {
        this.formFields = dataFactory
    });
    app.controller('ControllerTwo', function (dataFactory) {
        this.formData = dataFactory
    });
    app.factory('dataFactory', function () {
        return {};
    })
    

    编辑

    app.factory('dataFactory', function () {
        var factory = {
            method1: function (arg) {
                console.log('method1: ', arg)
                factory.method2('called from method1')
            },
            method2: function (arg) {
                console.log('method2: ', arg)
            }
        }
        return factory;
    })
    

    【讨论】:

    • 我明白了。如果工厂内有多个函数,如何在另一个函数中调用一个函数?你能举个例子吗?
    • 在工厂函数返回的对象内创建函数。
    猜你喜欢
    • 2015-07-22
    • 2012-07-19
    • 2015-12-21
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    相关资源
    最近更新 更多