Angularjs 角度:用户界面。路由器解析&;控制器代码复制
我一直在重构我的应用程序,以利用UI.Router的Angularjs 角度:用户界面。路由器解析&;控制器代码复制,angularjs,coffeescript,angular-ui-router,resolve,Angularjs,Coffeescript,Angular Ui Router,Resolve,我一直在重构我的应用程序,以利用UI.Router的状态。resolve来清理一些控制器逻辑。但随后我开始遇到以下问题:如何避免在获取已解析资产中的依赖项时发现的代码重复,以及在更新控制器中的数据时发现的代码重复 状态 $stateProvider.state 'someState', state = controller: 'SomeController' controllerAs: 'vc' resolve: { viewData: [ '$http'
状态。resolve
来清理一些控制器逻辑。但随后我开始遇到以下问题:如何避免在获取已解析资产中的依赖项时发现的代码重复,以及在更新控制器中的数据时发现的代码重复
状态
$stateProvider.state 'someState', state =
controller: 'SomeController'
controllerAs: 'vc'
resolve: { viewData: [
'$http'
'$q'
'$stateParams'
'someService'
($http, $q, $stateParams, someService)->
someService.get $stateParams.id
.then (rsp)-> rsp
.catch (err)-> $q.reject err
]}
视图控制器
class SomeController
constructor: (@$http, @$q, @$stateParams, @someService, @viewData)->
# non-Coffee FYI - @arg is the same as "this.arg = arg"
getViewData: ->
someService.get @$stateParams.id
.then (rsp)-> @viewData = rsp
.catch (err)-> $q.reject err
**一些服务**
class SomeService
constructor: (@$http, @$q)->
get: (id)->
$http.get "/url/#{id}"
.then (rsp)-> rsp.data?.data
.catch (err)-> $q.reject err
state的resolvedviewData
函数与contoller的getViewData
调用几乎相同。这似乎太多余了。利用相同代码有什么诀窍吗
我甚至想在解析对象中传递一个函数,该函数可以分配给控制器,当控制器需要执行相同的逻辑时,它可以利用该函数,但我无法找出(非ng)范围问题
现实生活
resolve
object获取初始viewData
viewData
上的更新公共代码必须分离为一个服务,并封装在函数中:
app.factory('viewDataService', function ($http, $q, $stateParams, someService) {
return function () {
return someService.get($stateParams.id).then(function(rsp) {
return rsp;
})["catch"](function(err) {
return $q.reject(err);
});
}
});
如图所示,这样每次注入服务时都可以调用someService.get
resolve: {
viewData: function (viewDataService) {
return viewDataService();
}
}
视情况而定。“url”在所有情况下都是一样的吗?“viewData”中的$http请求应该在每个状态解析时执行还是只执行一次?在试图理解您的意思后,我注意到我完全忘记了服务代码。这可能需要一个更广泛的例子,因为目前它非常微不足道。因此,是的,URL是相同的,不管它是调用它的解析对象还是视图控制器。就每一个vs once问题而言,我不确定我是否遵循了。如果这是你的意思,它不会被缓存。我想它可能与路由解析器的情况几乎相同。这对我来说不是问题,因为我使用父状态来处理任何继承的已解析依赖项。此特定的
viewData
请求对于视图是唯一的,这意味着没有其他路由/州会利用此请求。重复之处在于解决的依赖关系和后续控制器请求几乎相同。同样是一个非常简单的例子,但我尽量简洁。我将把它作为答案,因为它是正确的,我只希望我能找到一种更好的方法来封装它,当可能需要在服务调用之外执行逻辑时(例如,拉取$stateParams)但是w.o必须将该逻辑传递到服务中。@jusopi从外部将参数作为viewDataService函数参数传递在我看来很好,这确保了可测试性。但也许我误解了你,如果你在这个问题上还有问题,请随时用当前代码发布一个问题。