Успешно създадох фабрика, която получава изходен файл .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;
});
});