 <p>I think the main problem is you're not actually calling $http.get(), you're just defining it. Also, you should read more about async calls in Angular (they're a real pain, but they get pretty cool after you get a grasp of them). </p> <p>This got me started: <a href="http://chariotsolutions.com/blog/post/angularjs-corner-using-promises-q-handle-asynchronous-calls/" rel="nofollow">http://chariotsolutions.com/blog/post/angularjs-corner-using-promises-q-handle-asynchronous-calls/</a> (just make sure you stay away from their official documentation; it's a real mess that's either overcomplicated or over-simplified).</p> <p>Anyways, for your problem:</p> <p>Try this in your factory:</p> <pre><code>app.factory("PlantServiceLIVE", function($http) { var mData = { get_data : function(){ return $http.get('pages/getplants.php').success(function(data) { return mData.data = data; }); } }; return mData; }); </code></pre> <p>Then get the data (after you've received it) in your controller, like this:</p> <pre><code>app.controller('TestController', function($scope, $http, PlantServiceLIVE) { $scope.click_me = function(){ var wait = PlantServiceLIVE.mData(); wait.then(function(data){ console.log(data); //you should have your data here. $scope.Plants = data; }); } }); </code></pre> <p>Then make it touchable with </p> <pre><code>&lt;button ng-click="click_me()"&gt;Gimme plants&lt;/button&gt; </code></pre>