2015-04-19 2 views
1

У меня возникла проблема с попыткой установить довольно простой вызов с использованием фабрики и контроллера в угловых системах. Я пытаюсь следовать инструкциям по стилю Джона Папа и Тодда Мотто в настройке.Функция не определена ошибка в угловом контроллере

Во-первых, я использую 2 модуля

(function(){ 

'use strict'; 

    angular.module('app',[ 

    'app.core', 
    'app.property' 

    ]); 
})(); 

В 'app.core' Я определяю заводу

(function(){ 

'use strict'; 

angular.module('app.core') 
    .factory('dataservice',dataservice); 

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

function dataservice($http,$q) { 

var service = { 
    getListing: getListing 
}; 

return service; 


function getListing() { 

     var def = $q.defer; 

     $http.get("http://acme.com/property/1?format=json") 
     .success(function(data){ 
      service.getListing = data; 
      def.resolve(data); 
     }); 

     return def.promise; 


} 
} 
})(); 

и в 'app.property' Я определил контроллер

(function(){ 

    'use strict'; 

    angular.module('app.property') 
    .controller('PropertyCtrl',PropertyCtrl); 

    PropertyCtrl.$inject = ['dataservice']; 

    function PropertyCtrl(dataservice) { 

    var vm = this; 
    vm.listings = []; 

    activate(); 

    function activate() { 
    return getListing().then(function(){}); 
    } 
    function getListing(){ 
    return dataservice.getListing().then(function(data){ 
     vm.listings = data; 
     console.log("data is"); 
     console.log(data); 
     return vm.listings; 
    }); 
    } 
    } 
})(); 

Ошибка, которую я получаю на выходе консоли:

Ошибка: dataservice.getListing (...) не определено, за исключением, когда я инспектировать DataService в хроме можно увидеть enter image description here

Далее я получаю

TypeError: Cannot read property 'then' of undefined 

TypeError: def.resolve is not a function 

Несмотря на эти ошибки удаленный вызов возвращает JSon штраф.

Надеясь, что у кого-то с угловыми отбивными есть идея, где я пошла не так.

ответ

1

Вы очень близко. Это должно быть $q.defer() но вы $q.defer

function getListing() { 
     var def = $q.defer(); 
     $http.get("http://acme.com/property/1?format=json") 
     .success(function(data){ 
      service.getListing = data; 
      def.resolve(data); 
     }); 
     return def.promise; 
} 
+0

вниз избиратели делают комментарии причину и так, что я могу улучшить. – mohamedrias

+0

Я не проголосовал за это, но я не думаю, что это была проблема ОП. Это может быть проблема * A * с его кодом, но я не думаю, что это было причиной ошибки, о которой он упомянул. – tpie

+1

Если вы видите ошибку, которую получает OP, 'Can not read property 'then' of undefined', которая связана с отсрочкой. Но в dataservice getlisting() имеется. Так что ясно, что из-за этого – mohamedrias

1

Вы должны реально создать модули, которые строят на:

Помещенный это выше объектов вашего app.property модуля: angular.module('app.property', []);

Поместите это выше объектов вашего app.core модуля: angular.module('app.core', []);

Вы в основном подключая завод и контроллер к модулям, которые не существуют. Вы пытаетесь внедрить модули, которые не существуют в ваш основной модуль.

Здесь plunker показаны проблемы, которые вы разрешили. У вашего кода есть другие проблемы, но, по крайней мере, сейчас он находит модули, что было вашей исходной проблемой.

Следует также отметить, что mohamedrias также правильна - у вас возникла ошибка в синтаксисе, если вы не поставили () на ваш запрос дефер. Я обновил свой плункер, чтобы включить его исправление.

Смежные вопросы