/ / споделете http.get данни между фабрика и контролер - http, angularjs, angularjs-range

споделете http.get данни между фабричните и контролера - http, angularjs, angularjs-scope

Успешно създадох фабрика, която получава изходен файл .php (JSON),

Въпросът ми е как да осъществя достъп до него от контролера:

myApp = angular.module("myApp", [])

myApp.factory "mainData",  ($http) ->
$http.get("gethome.php").success (data) ->
data: data
console.log(data)

myApp.controller "HomeCtrl", ($scope, mainData) ->
$scope.home = mainData.data

Моля, уведомете ме дали аз избирам правилния синтаксис тук, Виждам много примери как да създадете модул / контролер навсякъде в уроци, и аз търся правилния начин

Отговори:

9 за отговор № 1

Когато инжектирате фабрики в ъглови контролери, инжектираната фабрична справка съдържа онези членове, които сте се върнали от фабриката:

myApp.factory("mainData", function($http) {
var mData = {};
$http.get("gethome.php").success(function(data) {
mData.data = data;
});
return mData;
});


myApp.controller("HomeCtrl", function($scope, mainData) {
$scope.home = mainData.data; // Here mainData equals mData object literal from the mainData factory
});

Но проблемът с вашия код е тази mainData.данните винаги ще бъдат неопределени, защото фабриката ще се върне преди да бъде завършена заявката за async $ http. Затова вместо това вашата фабрика трябва да връща обещание:

myApp.factory("mainData", function($http) {
return $http.get("gethome.php");
});

myApp.controller("HomeCtrl", function($scope, mainData) {
mainData.success(function(data) {
$scope.home = data;
});
});

Забележка: Методите $ http винаги връщат обещание по подразбиране.


3 за отговор № 2

Можете да използвате това:

myApp.factory("mainData", function($http,$q) {
var def =   $q.defer()
$http.get("gethome.php").then(function(data){
def.resolve(data)
});
return def.promise;
});

myApp.controller("HomeCtrl", function($scope, mainData) {
mainData.then(function(data) {
$scope.home = data;
});
});