【发布时间】:2017-07-25 00:39:36
【问题描述】:
我正在使用ui-router 制作网页。在我们进入控制器之前,我想要做一些操作: 1)在服务器中创建一个临时文件夹并写入一些文件; 2)记录文件夹的名称和一些其他数据。所以很自然地我选择使用resolve。
.state('panels', {
controller: 'PanelsCtrl',
resolve: {
init: ['codeService', function (codeService) {
return codeService.init()
}]
},
...
});
app.service('codeService', ['$http', function ($http) {
var srcP = "default" // private variable
this.getSrcP = function () { return srcP };
this.init = function () {
return $http.post("/writeFiles", ...) // write files in a temporary folder of the server
.then(function (res) {
srcP = res.data;
return srcP
}
}
};
app.controller('PanelsCtrl', ['$scope', 'codeService', 'init', function($scope, codeService, init) {
$scope.src = codeService.getSrcP();
...
}
上面的代码有效。但是,我觉得奇怪 1)我解析的是异步函数(即init)而不是数据(人们通常会解析); 2) 我使用init 的副作用来记录数据(即srcP)在服务中。
看来,与解析数据相比,我们记录的数据越多,就越容易,我们只需要拥有更多的私有变量,并在服务中产生更多的副作用。
有谁知道我的做法是不好/常见/好的做法?另外,为什么resolve: {...}中的codeService和codeService注入PanelsCtrl共享相同的私有变量?
【问题讨论】:
-
大多数角度指南都说在服务中解决承诺不是一个好习惯。在您的情况下,您可以在
panles状态的解析中解决承诺,而不是在控制器中注入init,您可以直接注入srcP。但我的问题是,srcP仅适用于PanelsCtrl,还是您与其他控制器共享的通用值?无论如何,在某些情况下,您可能会为了解决方案的利益而违反准则:) -
srcP仅用于PanelsCtrl,还有其他值我也想记录。我应该注入一个包含所有值的对象到PanelsCtrl吗? -
我不明白的一件事是为什么
resolve: {...}和codeService中的codeService注入PanelsCtrl共享相同的私有变量?它们实际上是同一个对象吗? -
最后一个问题,是的...
codeService是一个单身人士。检查此post 以查看服务和工厂详细信息。 -
关于“我也想记录其他值”,这些值来自其他端点?或者你可以在http post到
/writeFiles之后获取所有信息?
标签: javascript angularjs angular-ui-router promise angular-services