【问题标题】:Passing data between controller via service won't work通过服务在控制器之间传递数据不起作用
【发布时间】:2017-03-10 14:42:59
【问题描述】:

我正在尝试使用服务、工厂或广播在控制器之间传递数据的所有方法。它们都不适合我。我在网上遵循了确切的解决方案,但仍然很不幸。我将服务放在我的 app.js 中。

App.JS

myApp.service('customService', [function () {
    this.list = [];

    this.setObject =  function (o) {
        this.list.push(o);
    },
    this.getObject =  function () {
        return this.list;
    }
}]);

控制器 #1

myApp.controller('Controller1', function ($scope, customService) {
    customService.setObject({..});
    $window.open("/controller2", '_blank');
}

控制器 #2

myApp.controller('Controller2', function ($scope, customService) {
 console.log(customService.getObject()); // Returns []
}

问题

它从控制器 1 返回控制器 2 上的 [],而不是对象数据。

【问题讨论】:

  • getObject 您想检索对象数组还是仅检索一个特定对象?
  • previewService.getObject() 不会抛出异常?它与 customService 的名称不同
  • @Groben 应该同名。
  • @lealceldeiro 只是一个对象。但它没有返回任何东西..

标签: javascript angularjs service


【解决方案1】:

您应该修改您的服务,以便在某个特定键下存储对象,然后在给定该键的情况下检索它。您可以随意定义这些键。我在同一个服务中定义了它们,因此我可以通过所有控制器重用它们。像这样的

服务

myApp.service('customService', [function () {
    this.keys = {"foo": "foo", "bar": "bar"};
    this.list = {};

    this.setObject =  function (obj, key) {
        this.list[ley] = obj;
    },
    this.getObject =  function (key) {
        return this.list[key];
    }
}]);

控制器 #1

myApp.controller('Controller1', function ($scope, customService) {
    customService.setObject({"propX": "propX"}, customService.foo);
    //$window.open("/controller2", '_blank');
    /* I encourage you to use something like ngRoute here for navigating
     * so, you should do something like $location.path('/controller2');
     */
}

控制器 #2

myApp.controller('Controller2', function ($scope, customService) {
 console.log(customService.getObject(customService.foo));
}

【讨论】:

  • 它不起作用。第二个控制器返回“未定义”,即使我有正确的this.list[key] = obj;
  • 你怎么去/controller2路线?你在使用 ngRoute 吗?我的意思是,它是如何实例化的 Controller2 的?该页面不应重新加载,您也不能在另一个选项卡中打开它。请确认。
  • @Foonation,我没有意识到 Controller1 我只是复制并粘贴了$window.open("/controller2", '_blank'); 部分,但我鼓励您在这里使用不同的方法。请查看我编辑的答案
  • @Foonation,太棒了!
【解决方案2】:

你的控制器在同一个页面吗?

Angular.js 只能工作并将数据保存在单个页面上。如果您的页面重新加载 (正如您在说“express.js 加载下一个 page",然后它重新初始化所有内容。

您应该:

看看如何使用 Angular.js 路由 (http://docs.angularjs.org/tutorial/step_07) 让您留在 同一页。使用某些东西来持久化您的数据,例如本地存储。 了解更多:http://diveintohtml5.info/storage.html

参考:Using angular service to share data between controllers

【讨论】:

    【解决方案3】:

    你用过路由吗?如果你使用,那么你的代码应该可以工作。

    【讨论】:

    • 我在使用 RouteProvider 而不是 state。
    • 如果你想改变像 $window.open("/controller2", '_blank') 这样的页面。那个时候你的数据不能通过controller2。因为那时您的应用会重新加载,服务会创建新的不同实例。
    猜你喜欢
    • 2014-01-30
    • 2013-07-30
    • 1970-01-01
    • 2021-02-14
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多