【问题标题】:Loading data for controller in Angular.js with resolve and $resource使用 resolve 和 $resource 在 Angular.js 中为控制器加载数据
【发布时间】:2014-05-14 16:48:29
【问题描述】:

我正在尝试通过 Id 从 API 加载作业并将其传递给控制器​​。

.when('/jobs/edit/:id', {
    templateUrl: 'partials/jobs/edit',
    controller: 'JobCtrl',
    resolve: function($routeParams, Job){
        var jobId = $routeParams.id;

        return {
            job: function(){
                return Job.get({ id: jobId});
            }
        };
    }
})

控制器:

angular.module('App')
  .controller('JobCtrl', function ($scope, Job, $location, $routeParams) {
        $scope.newJob = data.job; //does not work
        $scope.errors = {};

        $scope.save = function (form) {
                   //...
        };
    });

型号:

angular.module('App')
    .factory('Job', function ($resource) {
        return $resource('/api/jobs/:id', {
            id: '@id'
        }, { //parameters default
            update: {
                method: 'PUT'
            }
        });
    });

如何获取控制器中的数据?我在路由中的resolve 块甚至没有被执行。

编辑:此页面有很多不同类型的解析示例: http://phillippuleo.com/articles/angularjs-timing-multiple-resource-resolves-ngroute-and-ui-router

【问题讨论】:

  • data.job 是错字吗?我不确定您期望该数据变量来自哪里?
  • 不解析返回带有键 job: { ... } 的对象?

标签: angularjs


【解决方案1】:

您的解决方案似乎不正确。
您可以尝试更改路由器,例如:

.when('/jobs/edit/:id', {
  templateUrl: 'partials/jobs/edit',
  controller: 'JobCtrl',
  resolve: {
    job: function (Job, $routeParams) {
      return Job.get({id: $routeParams.id});
    }
  }
})

并通过将Job 包含在依赖项中来获取控制器中解析的数据:

angular.module('App')
  .controller('JobCtrl', function ($scope, job, $location, $routeParams) {
    // job is resolved here
    $scope.job = job;
    $scope.newJob = {};
    $scope.errors = {};

    $scope.save = function (form) {
               //...
    };
  });

更新
如果您想使用JobCtrl 进行创建和编辑,您可以在解析后的job 中返回null 以获得新作业页面。这意味着:在您创建之前,还没有任何工作。

.when('/jobs/new', {
  templateUrl: 'partials/jobs/new',
  controller: 'JobCtrl',
  resolve: {
    job: function () {
      return null;
    }
  }
})

【讨论】:

  • 这不起作用,因为一旦进入控制器,承诺还没有解决。
  • controller('JobCtrl', function ($scope, Job - 如果您想要解析的数据,它必须是 job。
  • @chovy 我犯了一个错误,zeroflagL 纠正了它。您需要将已解析参数包含到控制器依赖项中。已编辑,您可以试一试。
  • 这行得通,但有一个警告,我使用这个控制器来创建一个新的和编辑一个工作。在新作业的情况下,没有解析器,因此注入“作业”然后在控制器中引发错误,因为它没有定义。
  • @chovy。您可以使用 $q 来包装 $resource 执行。检查this out。
猜你喜欢
  • 2015-06-17
  • 1970-01-01
  • 2014-08-28
  • 2014-08-10
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多