【问题标题】:Angular UI-Router - using "resolve" directly on template urlAngular UI-Router - 直接在模板 url 上使用“resolve”
【发布时间】:2015-12-23 14:03:58
【问题描述】:

我正在使用 UI-Router 并希望将路由更改为“基于组件”。因此,我不想定义控制器/模板,而是像这样使用它:

.state('issue', {
    url: '/someUrl/:number',
    template: '<my-directive></my-directive>',
    resolve: {
      data: function(dataService) {
        return dataService.getData().then(function(response) {
            console.log(response.data);
            return response.data;
        });
      }
    }
 })

现在,我知道有了 Angular 的 ngRoute,我可以直接在模板中使用已解析的数据,例如:

 $routeProvider
      .when('/', {
        template: `<my-directive data="resolve.data"></my-directive>`,
        resolve: {
          data: function (dataService) {
            return dataService.getData();
          }
        }
      }) 

我无法使用 UI-Router 来实现(值未定义)。

我做错了吗?是否可以使用ui-router?

【问题讨论】:

    标签: javascript angularjs angular-ui-router angular-ui state


    【解决方案1】:

    UI-Router 的点是 - resolve 的结果可用于 controller (与模板相关)。所以,我们可以这样做:

    .state('issue', {
        url: '/someUrl/:number',
        template: '<my-directive data="stateCtrlData"></my-directive>',
        controller: function($scope, data) { $scope.stateCtrlData = data },
        resolve: {
          data: function(dataService) {
            return dataService.getData().then(function(response) {
                console.log(response.data);
                return response.data;
            });
          }
        }
      })
    

    data 被传递给控制器​​,我们从它的作用域将它传递给指令。

    【讨论】:

    • 如果有帮助就太好了;) 享受强大的 UI-Router
    【解决方案2】:

    如果你的意思是注入你的数据服务,那么你可以这样做(记住''是告诉注入):

    state('issue', {
            url: '/someUrl/',
            template: '<my-directive data="pep.data"></my-directive>',
            controller: function( data) { this.data = data },
            controllerAs: 'pep',  
            resolve:{
                     dataSvc : 'YourDataSvc',
                     campaign : function(dataSvc){
                             return dataSvc.getData();
    
                    }
                 }
    

    请记住,如果您想添加其他视图或子状态,则需要 ui-view

    【讨论】:

      【解决方案3】:

      其实可以(只在ui-router v0.3.2测试过)

      有一个 undocumented $resolve 变量自动注入到控制器中。 只需将 'controllerAs' 属性添加到状态中,如下所示,您可以在模板中使用 $resolve:

      .state('issue', {
          url: '/someUrl/:number',
          template: '<my-directive data="vm.$resolve.data"></my-directive>',
          controllerAs: 'vm',
          resolve: {
            data: function(dataService) {
              return dataService.getData().then(function(response) {
                  console.log(response.data);
                  return response.data;
              });
            }
          }
       })
      

      【讨论】: