9

Mam do czynienia z problemem z konwersją kontrolerów na komponenty przygotowujące moją aplikację dla Angular 2, ale problem migracji nie idzie dobrze, mam router do routingu między stanami i używanie rozwiązania w kilku kontrolerach, wersja z kontrolerem działa, ale wersja składników w ogóle działa, śledziłem wiele przewodników i wydaje mi się, że robię dobrze dla kodu, ale to nie działa dla mnie.Angularne komponenty 1.5 z rozwiązaniem dla interfejsu użytkownika: nieznany dostawca

mam następujące modułu z sterownika:

(function() { 
    'use strict'; 

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

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

kontroler:

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

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

Powyższy kod działa dobrze, ale po czyni go jako składnika jego stać się tak:

(function() { 
    'use strict'; 

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

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

Komponent:

(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; 
    } 
})(); 

Ale teraz jej nie działa i daje mi następujący błąd:

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 

Moje zależności wewnątrz 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" 
    } 

Każdy pomysł, jaki jest problem, czego mi brakuje?

+0

Czy możesz potwierdzić, że masz js zawierający usługę SampleData w index.html? – gyc

+0

@gyc Już piszę plik js, jeszcze nie przeniesiony do ts, wciąż używając kątowego 1.5 przygotowuję się do drugiej fazy z ts później, i mogę użyć 'myService' wewnątrz kontrolera, SampleData nie jest niezależną usługą serwisową, jest zmienną który rozwiązał wewnętrzny moduł, jak widać w pierwszym sterowniku i module, który działają. –

Odpowiedz

23

Wreszcie rozwiązano go źle zrozumiałem, że jak komponenty działają.

Najpierw zmieniam SampleData na sampleData, przypadek Pascal, ale z małą małą literą.

Następnie wewnątrz module Zmieniłem template do template: '<sample sample-data="$resolve.sampleData"></sample>'

i resolve do:

resolve: { 
    sampleData: function (msApi) { 
    return msApi.resolve('[email protected]'); 
    } 
} 

I component Zmieniłem wiązanie, a także:

bindings: { 
    sampleData: '=' 
}, 

i wewnątrz controller z component I remov ed SampleData z podpisu i tak to nazwano $ctrl.helloText = $ctrl.sampleData.data.helloText;.

Więc ostateczny kod teraz jest tak: Dla Moduł:

(function() { 
    'use strict'; 

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

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

I komponent tak:

(function() { 
    'use strict'; 

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

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

I wreszcie zadziałało.

Edit: P.S .: Poza zakres pytań i odpowiedzi, Jeśli używasz komponentu bez państwa zbyt, trzeba uzyskać dane wewnątrz kontrolera zamiast zdecydowania, tak można nazwać składniki tam, gdzie chcesz.

+0

Uratowałeś mi dzień, dziękuję bardzo! –

+0

Dziękuję. Wciąż miałem problemy z uruchomieniem tego w mojej aplikacji, więc przeszukałem i znalazłem ten problem z GitHubem, który ma przykład: https://github.com/angular-ui/ui-router/issues/2793. – jsparks

+0

@jsparks, jakiego używasz nazwy? w każdym razie unikaj używania słowa "data" jako przedrostka lub standalone, –

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

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

Zamiast dawać jak wyżej, spróbuj wstrzykiwanie determinację „sampleData” w kontrolerze, jak poniżej:

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

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

nadzieja, że ​​pracuje dla Ciebie

+0

Kontroler działa dobrze, mój problem z komponentami, usuwam używając '.controller' do' .component' –