11

我知道关于如何在 Angular 控制器之间传递数据还有其他类似的问题。

我想知道的是如何在一个视图中处理这个问题..

假设我有一个用于登录、注册等的 UserController。还有一个用于实际应用功能的 AppController。

UserController 将相当简单,它与其他控制器是独立的。但是如果应用程序需要了解来自用户控制器的信息怎么办?

假设应用程序视图需要根据用户是否登录来隐藏/显示内容。或者可能是用户是男性还是女性等。

应用程序模型是否应该保留自己的用户模型状态副本?例如 appModel.isLoggedIn 、 appModel.gender 等?

感觉有点多余,但同时更可测试。

那么正确的方法是什么?

4

2 回答 2

19

简短的回答

创建服务,详见创建服务

长答案

服务 - 本身 - 应用程序范围的单例,因此它们非常适合保持跨视图、控制器和 co. 的状态:

app.factory('myService', [ function () {
  'use strict';
  return {
    // Your service implementation goes here ...
  };
}]);

一旦你编写并注册了你的服务,你就可以使用 AngularJS 的依赖注入功能在你的控制器中要求它:

app.controller('myController', [ 'myService', '$scope',
  function (myService, $scope) {
  'use strict';
  // Your controller implementation goes here ...
}]);

现在,在您的控制器内部,您拥有myService包含服务的单个实例的变量。在那里,您可以拥有一个isLoggedIn表示您的用户是否登录的属性。

于 2013-07-04T12:36:53.143 回答
2

为了进一步指定@GoloRoden 给出的答案,这是一个示例,说明如何在将服务作为依赖项的所有控制器之间共享状态值。

App.factory('formState', formState);

function formState() {        

    var state = {};

    var builder = "nope";
    var search = "nope";

    state.builder = function () {
        return builder;
    };

    state.search = function () {
        return search;
    };

    state.set = {
        'builder': function (val) {
            builder = val;
        },
        'search': function (val) {
            search = val;
        }
    };

    return {
        getStateManager: function () {
            return state;
        }
    };
}

App.controller('builderCtrl', builderCtrl);

builderCtrl.$inject = ['formState']
function builderCtrl(formState) {
    var stateManager = formState.getStateManager();

    activate();

    function activate() {
        console.log("setting val in builder");
        stateManager.set.search("yeah, builder!");

        console.log("reading search in builder: " + stateManager.search());
        console.log("reading builder in builder: " + stateManager.builder());
    }
}

App.controller('searchCtrl', searchCtrl);

searchCtrl.$inject = ['formState']
function searchCtrl(formState) {
    var stateManager = formState.getStateManager();

    activate();

    function activate() {
        console.log("setting val in search");
        stateManager.set.search("yeah, search!");

        console.log("reading search in search: " + stateManager.search());
        console.log("reading builder in search: " + stateManager.builder());
    }
}
于 2016-07-18T05:09:34.083 回答