我知道如何在Angular控制器之间传递数据还有其他类似的问题。
我想知道如何在视图中处理这个问题..
假设我有一个用于登录,注册等的UserController。 以及实际应用程序功能的AppController。
UserController相当容易,其余部分独立。 但是如果应用程序需要了解用户控制器中的内容呢?
让我们说应用视图需要隐藏/显示内容,具体取决于用户是否登录。 或者可能是用户是男性还是女性等。
应用模型应该保留自己的用户模型状态副本吗? 例如appModel.isLoggedIn,appModel.gender等?
感觉有点多余,但同时更容易测试。
那么这样做的正确方法是什么?
答案 0 :(得分:16)
创建服务,有关详细信息,请参阅Creating Services。
服务本身就是应用程序范围的单例,因此它们非常适合在视图,控制器和视图之间保持状态。共:
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
,表示您的用户是否已登录。
答案 1 :(得分:1)
要进一步指定@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());
}
}