【问题标题】:share http.get data between factory and controller在工厂和控制器之间共享 http.get 数据
【发布时间】:2013-07-05 13:54:08
【问题描述】:

我成功创建了一个获取 .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

如果我在这里选择了正确的语法,请告诉我, 我在教程中到处都看到了很多关于如何创建模块/控制器的示例, 我正在寻找正确的方法

【问题讨论】:

    标签: http angularjs angularjs-scope


    【解决方案1】:

    将工厂注入 Angular 控制器时,注入的工厂引用包含您从工厂返回的那些成员:

    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.data 将始终未定义,因为工厂将在异步 $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 方法总是返回一个 Promise。

    【讨论】:

      【解决方案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;
        });
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-30
        • 1970-01-01
        • 2015-12-15
        相关资源
        最近更新 更多