2015-07-03 4 views
1

Я новичок в AngularJS и все еще придерживаюсь основ.

Я создаю службу с $ http.get для загрузки нескольких Json-файлов. Когда я загружаю службу в контроллер, я получаю пустые массивы.

Это моя служба

app.service('productService', ['$http', function($http){ 
    var lista = this; 
    lista.products = []; 
    lista.menu = []; 

    $http.get('/prodotti_1.json').success(function(data){ 
     lista.products = data; 
    }); 

    $http.get('/menu_1.json').success(function(data){ 
     lista.menu = data; 
    }); 
}]); 

И это мой контроллер:

app.controller('ProductController', ['productService', function(productService){ 
    console.log(productService.products); 
    console.log(productService.menu); 
}]); 

Консоль печатает только пустой массив []. Если я положил console.log (данные) в обещание успеха, console.log печатает массив просто отлично. Я думал, что из кодовой школы это может быть проще, но я думаю, что мне не хватает точки, чтобы передать данные из обещания успеха контроллеру. Во многих других ситуациях я вижу использование переменной $ scope, но я узнал, что я также могу избежать использования, если я использую «это». Так вот, мой код не отображает никаких $ scope.

Я использую Angular 1.4.1 FYI, и я видел много форумов и других вопросов, но это похоже на другую ситуацию.

Спасибо

+0

Проблема в том, что вы загружаете свои данные асинхронно. То есть ваш список не назначается при вызове функции console.log. $ http.get не блокируется до тех пор, пока данные не будут доступны. –

+0

у вас отсутствует концепция обещания $ q: обещания асинхронны, поэтому, если вы поместите инициализацию внутри контроллера console.log, вы будете печатать только начальное значение, создать привязку или наблюдателя и проверить, что значения установлены – fantarama

ответ

1

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

app.service('productService', ['$http', function($http){ 
    return { 
     request1: $http.get('/prodotti_1.json'), 
     request2: $http.get('/menu_1.json') 
     } 
}]); 

Таким образом, вы можете справиться с этим в своем контроллере.

app.controller('ProductController', ['productService', function(productService){ 
    productService.request1.success(function(data){ 
     //access the data 
    }); 

    productService.request2.success(function(data){ 
     //access the data 
    }); 
}]); 

Надеюсь, это поможет.

+0

Это спасло мой день , оно работает! Могу ли я попросить вас объяснить больше теории о моем неправильном методе? Вы сказали: «Вы обращаетесь к переменным до того, как обещание будет разрешено», вы имеете в виду от контроллера? Я думал, что когда служба загружается внутри контроллера, она как-то «готова», включая ее свойства или методы ... в том, как вы исправили мой код, кажется, что услуга похожа на функцию для вызова – Nemesis19

+0

Другой вопрос. Мне нужно сделать весь мой код в обещании успеха? infact, если внутри успеха я ставлю «lista.products = data»; и за пределами обещания я пишу console.log (lista.products); У меня опять та же самая оригинальная проблема, так что я не понимаю? @Pravin – Nemesis19

+0

хорошо, когда вы вводите услугу, просто впрыскивая ее. И когда вы вызываете услугу в своей консоли, она переходит к сервису, создает экземпляр продукта и меню свойств и выполняет два асинхронных запроса и возвращает. На этом этапе HTTP-запрос все еще ожидает, что обещание будет разрешено как успех или неудача. Консоль.log() регистрирует текущее значение lista.products и lista.menu. Следовательно, он регистрирует пустой массив. Чтобы получить доступ к переменным после того, как обещание будет разрешено, вы должны получить к нему доступ из обратного вызова, который вызывается после получения ответа. – Pravin

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