2016-03-24 46 views
1

Denetleyici yöntemimden parametreleri olan bir hizmeti aramaya çalışıyorum ve bir işlev olmadığını söyleyen bir hata alıyorum.AngularJS TypeError: "track" bir işlev değil

angular.module('app.services') 
     .service('TrackService', TrackService); 

TrackService.$inject = ['$http', '$q']; 

function TrackService($http, $q){ 
    var trackService = {}; 

    var releasesUrl = 'http://localhost:8080/api/releases'; 
    trackService.currentTrack = currentTrack; 

     function currentTrack(releaseSlug, trackSlug){ 
     var trackUrl = releasesUrl + '/'+ releaseSlug + '/' + trackSlug + '/track'; 
     var deferred = $q.defer(); 

     $http.get(trackUrl).then(function(trackResponse){ 
      return deferred.resolve(trackResponse); 
     }, function(error){ 
      return deferred.reject({msg: 'Error while getting the current track details'}) 
     }); 
     return deferred.promise; 
    } 
} 

benim denetleyicisi hatası alacağı konusunda herhangi bir fikriniz: TypeError: trackService.currentTrack is not a function

cevap

1

Çok 1 şey söyleyebilirim

İşte
(function(){ 

angular.module('app.uploadedReleases') 
     .controller('UploadedReleasesController', UploadedReleasesController) 
     .controller('ModalController', ModalController); 


UploadedReleasesController.$inject = ['$log', '$scope', '$modal', 'ReleaseService', 'TrackService']; 
function UploadedReleasesController ($log, $scope, $modal, releaseService, trackService){ 

     vm.selectTrack = selectTrack; 

     function selectTrack(album, track, index){ 

     trackService.currentTrack(album.slug, track.fileName).then(function(responseValue){ 
      vm.temp = responseValue; 
     }); 
     vm.formTrack = vm.selected.track; 
    } 
} 

benim hizmet trackService denir: İşte benim kodudur Yani, bir hizmet oluşturuyorsunuz, daha sonra nesne oluşturmak yerine this bağlamına bağlamanız gerekir.

var trackService = {}; 

var trackService = this; 

geçmek Ama servisten özel nesne dönen de yanlış değildir ederim. Yani şimdiki durumda onu iade ettin. Servis kodunun sonuna eklenecek

return trackService 

hizmet & fabrika iş, ben Sen vardı trackService.currentTrack yönteminden söz dönmelidir this answer


üzerine readup tavsiye ederim nasıl Hala karıştı özel olarak oluşturulmuştur.

trackService.currentTrack = currentTrack; 
function currentTrack(releaseSlug, trackSlug){ 
    var trackUrl = releasesUrl + '/'+ releaseSlug + '/' + trackSlug + '/track'; 
    var deferred = $q.defer(); 
    $http.get(trackUrl).then(function(trackResponse){ 
     return deferred.resolve(trackResponse); 
    }, function(error){ 
     return deferred.reject({msg: 'Error while getting the current track details'}) 
    }); 
    return deferred.promise; //returned promise 
} 

Aksine sizden söz $http.get yöntemle döndü nerede uygulamak gibi anti-desen düşünün olan özel sözünü yapmak olmalıdır Bunu kullanmak gerekir.

Refactored Versiyon

trackService.currentTrack = currentTrack; 
    function currentTrack(releaseSlug, trackSlug){ 
    var trackUrl = releasesUrl + '/'+ releaseSlug + '/' + trackSlug + '/track'; 
    return $http.get(trackUrl).then(function(trackResponse){ 
     return trackResponse; 
    }, function(error){ 
     return {msg: 'Error while getting the current track details'}; 
    }); 
} 
+0

Teşekkürler @Pankaj Parkar. 'Return deferred.promise' özelliğini ekledim ve hala aynı sorunla karşılaştım. – noobcoder

+0

@noobcoder 'vm.selectTrack = selectTrack' nedir anlamak gerçekten zor? ve sonra vm.formTrack = vm.selected.track; 'nereden geliyor? –

+0

Bunlar gibi tanımladığım nesneler şunlardır: 'vm.formTrack = selectTrack' işlevinden bir geri dönüş değeri olarak selectTrack – noobcoder

3

@Pankaj Parkar cevabı size denetleyicisi zinciri then amacıyla currentTrack gelen bir söz dönen gerektiğini de doğrudur. Ancak, TypeError hakkındaki sorunuzu yanıtlamak için, fabrika ve hizmet sözdizimini TrackService numaralı telefondan karıştırıyorsunuz.

, bir fabrika yapmak maruz fonksiyonları bir harita dönmek için:

function TrackService($http, $q){ 
    var trackService = {}; 
    trackService.currentTrack = currentTrack; 

    function currentTrack(releaseSlug, trackSlug){ 
     //... 
    } 

    return trackService; 
} 

ve .factory('TrackService', TrackService); ile beyan ederim.

this maruz fonksiyonlar eklemek, bir hizmet yapmak için:

function TrackService($http, $q){ 
    this.currentTrack = currentTrack; 

    function currentTrack(releaseSlug, trackSlug){ 
     //... 
    } 
} 

ve .service('TrackService', TrackService); ile beyan ederim.

+0

Ben zaten benim cevapta anladım .. hala iyi bulmak +1 –

+0

@nickgraef Hizmetimde aynı şeyi yapıyorum. 'var trackService = {}' – noobcoder

+2

@noobcoder aynı değil çünkü bir serviste buna bağlı olması gerekiyor ve bir fabrikada, trackService nesnesini – sdemurjian

İlgili konular