Angularjs 角度:用户界面。路由器解析&;控制器代码复制

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'

我一直在重构我的应用程序,以利用UI.Router的
状态。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的resolved
viewData
函数与contoller的
getViewData
调用几乎相同。这似乎太多余了。利用相同代码有什么诀窍吗

我甚至想在解析对象中传递一个函数,该函数可以分配给控制器,当控制器需要执行相同的逻辑时,它可以利用该函数,但我无法找出(非ng)范围问题

现实生活
  • 进入状态,
    resolve
    object获取初始
    viewData
  • 已设置当前视图数据的状态控制器和UI呈现
  • view controller轮询获取服务以每x分钟检查
    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函数参数传递在我看来很好,这确保了可测试性。但也许我误解了你,如果你在这个问题上还有问题,请随时用当前代码发布一个问题。