使用ui-router解决的Angular 1.5组件:未知的提供程序

时间:2016-07-13 08:37:45

标签: angularjs angular-ui-router angularjs-components angularjs-1.5

我面临着将控制器转换为准备Angular 2应用程序的组件的问题,但是迁移不顺利的问题,我有ui路由器在状态之间路由并在几个控制器中使用resolve,带控制器的版本正在运行,但组件的版本现在正在运行,我遵循了很多指南,似乎我对代码做得很好,但它不适合我。

我有以下模块控制器

(function () {
  'use strict';

  angular
    .module('app.sample', [])
    .config(config);

  /** @ngInject */
  $stateProvider
    .state('app.sample', {
      url    : '/sample',
      views  : {
        'content@app': {
          templateUrl: 'app/main/sample/sample.html',
            controller : 'SampleController as vm'
          }
        },
        resolve: {
          SampleData: function (myService) {
            return myService.getSample(); // I return a promise here
          }
       }
     });
  }
})();

控制器

(function ()
{
    'use strict';
    angular
        .module('app.sample')
        .controller('SampleController', SampleController);

    /** @ngInject */
    function SampleController(SampleData)
    {
        var vm = this;
        vm.helloText = SampleData.data.helloText;
    }
})();

以上代码运行良好,但在将其作为组件后,它变成了这样:

(function () {
  'use strict';

  angular
    .module('app.sample', [])
    .config(config);

  /** @ngInject */
  function config($stateProvider) {
    // State
    $stateProvider
      .state('app.sample', {
        url: '/sample',
        views: {
          'content@app': {
            template: '<sample></sample>'
          }
        },
        resolve: {
          SampleData: function (myService) {
            return myService.getSample(); // I return a promise here
          }
        }
      });
  }
})();

组件

(function () {
  'use strict';

  angular
    .module('app.sample')
    .component('sample', {
      templateUrl: 'app/main/sample/sample.html',
      bindings: {
      },
      controller: Sample
    });

  /** @ngInject */
  function Sample(SampleData) {
    var $ctrl = this;
    $ctrl.helloText = SampleData.data.helloText;
  }
})();

但现在它不起作用并给我以下错误:

Error: [$injector:unpr] Unknown provider: SampleDataProvider <- SampleData
http://errors.angularjs.org/1.5.7/$injector/unpr?p0=SampleDataProvider%20%3C-%20SampleData
    at angular.js:68
    at angular.js:4502
    at Object.getService [as get] (angular.js:4655)
    at angular.js:4507
    at getService (angular.js:4655)
    at injectionArgs (angular.js:4679)
    at Object.invoke (angular.js:4701)
    at $controllerInit (angular.js:10234)
    at nodeLinkFn (angular.js:9147)
    at angular.js:9553

我在 bower.json 中的依赖关系:

"dependencies": {
    "angular": "1.5.7",
    "angular-animate": "1.5.7",
    "angular-aria": "1.5.7",
    "angular-cookies": "1.5.7",
    "angular-material": "1.1.0-rc.5",
    "angular-messages": "1.5.7",
    "angular-resource": "1.5.7",
    "angular-sanitize": "1.5.7",
    "angular-ui-router": "1.0.0-beta.1",
    "jquery": "2.2.4",
    "mobile-detect": "1.3.2",
    "moment": "2.13.0"
  }

知道问题是什么,我缺少什么?

2 个答案:

答案 0 :(得分:24)

最后解决了它,我误解了组件是如何工作的。

首先我将SampleData更改为sampleData,Pascal Case,但首字母小。

然后在module内,我将template更改为template: '<sample sample-data="$resolve.sampleData"></sample>'

resolve

resolve: {
  sampleData: function (msApi) {
    return msApi.resolve('sample@get');
  }
}

对于component我也改变了绑定:

bindings: {
  sampleData: '='
},

controller的{​​{1}}内,我从签名中删除了component,并将其称为SampleData

所以现在的最终代码如下: 对于模块

$ctrl.helloText = $ctrl.sampleData.data.helloText;

组件是这样的:

 (function () {
  'use strict';

  angular
    .module('app.sample', [])
    .config(config);

  /** @ngInject */
  function config($stateProvider) {
    // State
    $stateProvider
      .state('app.sample', {
        url: '/sample',
        views: {
          'content@app': {
            template: '<sample sample-data="$resolve.sampleData"></sample>'
          }
        },
        resolve: {
          sampleData: function (myService) {
            return myService.getSample(); // I return a promise here
          }
        }
      });
  }
})();

最后工作了。

修改 P.S。:在问答范围之外,如果您也使用没有状态的组件,您需要在控制器内部获取数据而不是解析,因此您可以在任何地方调用组件。

答案 1 :(得分:0)

'use strict';
angular
    .module('app.sample')
    .controller('SampleController', SampleController);

/** @ngInject */
function SampleController(SampleData)
{
    var vm = this;
    vm.helloText = SampleData.data.helloText;
}

不要像上面那样给出,而是尝试注入&#39; SampleData&#39;在你的控制器中解决,如下所示:

'use strict';
angular
    .module('app.sample')
    .controller('SampleController', ['SampleData', SampleController]);

/** @ngInject */
function SampleController(SampleData)
{
    var vm = this;
    vm.helloText = SampleData.data.helloText;
}

希望对你有用