Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS-控制器之间的共享状态?_Angularjs - Fatal编程技术网

AngularJS-控制器之间的共享状态?

AngularJS-控制器之间的共享状态?,angularjs,Angularjs,我知道关于如何在角度控制器之间传递数据还有其他类似的问题 我想知道的是如何从一个角度来处理这个问题 假设我有一个用于登录、注册等的UserController。 以及用于实际应用程序功能的AppController UserController将相当简单,它有点像是独立的。 但是,如果应用程序需要从用户控制器了解有关内容,该怎么办 假设应用程序视图需要根据用户是否登录隐藏/显示内容。 如果用户是男性或女性等,也可能是这样 应用程序模型是否应该保留自己的用户模型状态副本? e、 g.appMode

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

我想知道的是如何从一个角度来处理这个问题

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

UserController将相当简单,它有点像是独立的。 但是,如果应用程序需要从用户控制器了解有关内容,该怎么办

假设应用程序视图需要根据用户是否登录隐藏/显示内容。 如果用户是男性或女性等,也可能是这样

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

感觉有点多余,但同时更易于测试

那么正确的方法是什么呢?

简短回答 创建服务,有关详细信息,请参阅

长话短说 服务本身是应用程序范围的单例,因此它们非常适合在视图、控制器和公司之间保持状态:

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
,它表示您的用户是否登录。

要进一步指定@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());
    }
}

所以,如果我有一个UserService,它包含userid,isLoggedIn属性。。并在我的控制器之间共享此对象。。我可以在视图中直接绑定到它吗?例如{{userState.Username}?服务状态的变化是否会以与模型相同的方式进行跟踪?请看一下,这将回答您的问题。