2016-02-09 150 views
0

我試圖通過使用$控制器之間的$ HTTP功能的服務共享數據。我試圖將SUCCESS中的返回數據傳遞給另一個控制器。有些問題我認爲在服務中數據沒有傳到第二個控制器。下面是我的代碼,有人可以看看它,並告訴我我做錯了什麼,指向我在正確的方向上做什麼。在AngularJS和IONIC中的控制器之間共享數據

services.js

.factory('userService', function ($http) { 
    var url = "url.php"; 
    var headers = { 
     'Content-Type' : 'application/x-www-form-urlencoded; charset-UTF-8' 
    }; 
    var params = ""; 
    return { 

     getUsers : function (entry, searchTypReturn) { 
      params = { 
       entry : entry, 
       type : searchTypReturn, 
       mySecretCode : 'e8a53543fab6f5e' 
      }; 

      return $http({ 
       method : 'POST', 
       url : 'https://servicemobile.mlgw.org/mobile/phone/phone_json.php', 
       headers : { 
        'Content-Type' : 'application/x-www-form-urlencoded; charset-UTF-8' 
       }, 
       transformRequest : function (obj) { 
        var str = []; 
        for (var p in obj) 
         str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); 
        return str.join("&"); 
       }, 
       data : params 
      }) 
      .success(function (data, status, headers, config) { 

       return data; 

      }); 

     } 
    } 
}) 

controller.js

.controller('phoneController', function ($scope, md5, $http, userService, $ionicLoading, $location, $ionicPopup) { 

    userService.getUsers(form.entryText, searchTypReturn).success(function (data, status, headers, config) { 
     $ionicLoading.hide(); 
     $scope.name = data.PlaceDetailsResponse.results[0].first_name; 
     if ($scope.name == 0) { 
      $scope.showAlert(); 

     } else { 

      $location.path('phoneView'); 
      $ionicLoading.hide(); 
     } 
    }).error(function (data, status, headers, config) { 
     $scope.showAlert(); 
     $ionicLoading.hide(); 
    }) 

}); 

.controller('phoneViewController', function ($scope, userService) { 
    $scope.input = userService; 
    console.log('This is from phoneView', $scope.input); 
}); 
+0

您是否需要將接收到的數據從控制器中的API傳遞到另一個控制器? –

+0

你不能成功返回,沒有什麼可以返回的。使用'then()'從promise對象返回數據 – charlietfl

+0

@NasserGhiasi是的,這就是我想要做的。 – Dwill

回答

0

可以存儲從API接收到的數據在$ rootScope或全局變量,也可以在工廠存儲數據。

例如,使用數據工廠(推薦)

angularApp.factory('appDataStorage', function() { 
var data_store = []; 

return { 
    get: function (key) { 
     //You could also return specific attribute of the form data instead 
     //of the entire data 
     if (typeof data_store[key] == 'undefined' || data_store[key].length == 0) { 
      return []; 
     } else { 
      return data_store[key]; 
     } 

    }, 
    set: function (key, data) { 
     //You could also set specific attribute of the form data instead 
     if (data_store[key] = data) { 
      return true; 
     } 
    }, 
    unset: function (key) { 
     //To be called when the data stored needs to be discarded 
     data_store[key] = {}; 
    }, 
    isSet: function (key) { 
     if (typeof data_store[key] == 'undefined' || data_store[key].length == 0) { 
      return false; 
     }else { 
      return true; 
     } 
    } 
}; 
}); 

    angularApp.controller('phoneController', function($scope, md5, $http, userService, $rootScope, $ionicLoading, $location, $ionicPopup , appDataStorage) { 

var data = userService.getUsers(form.entryText,searchTypReturn).success(function(data, status, headers, config) { 
    $ionicLoading.hide(); 
    $scope.name = data.PlaceDetailsResponse.results[0].first_name; 
    if ($scope.name == 0) { 
      $scope.showAlert(); 

    } else { 

     $location.path('phoneView'); 
     $ionicLoading.hide(); 
    } 
}).error(function(data, status, headers, config) { 
    $scope.showAlert(); 
    $ionicLoading.hide(); 
}); 

appDataStorage.set('key1',data); 

} 
}); 

angularApp.controller('phoneViewController', function($scope,$rootScope,appDataStorage) { 
$scope.input = appDataStorage.get('key1'); 
console.log('This is from phoneView',$scope.input); 
}) 
1

納賽爾的答案是正確的使用$ rootScope

angularApp.controller('phoneController', function($scope, md5, $http, userService, $rootScope, $ionicLoading, $location, $ionicPopup) { 

$rootScope.data = userService.getUsers(form.entryText,searchTypReturn).success(function(data, status, headers, config) { 
    $ionicLoading.hide(); 
    $scope.name = data.PlaceDetailsResponse.results[0].first_name; 
    if ($scope.name == 0) { 
      $scope.showAlert(); 

    } else { 

     $location.path('phoneView'); 
     $ionicLoading.hide(); 
    } 
}).error(function(data, status, headers, config) { 
    $scope.showAlert(); 
    $ionicLoading.hide(); 
}) 

} 
}); 

.controller('phoneViewController', function($scope,$rootScope) { 
$scope.input = $rootScope.data; 
console.log('This is from phoneView',$scope.input); 
}) 

。如果只是基於會話,還有其他一些方法可以記錄內存中的事物。

例如有http://lokijs.org/該申請也要求該數據會話之間保持,因爲它被寫入到一個文件中。它取代了SQLite

控制器和其獲取從所述指令是鬆耦合的範圍中顯示的數據中的指令之間的關係。

如果沒有顯示在像{{valuetobedisplayedfromcontroller}}範圍你的HTML變得時髦值。

有2個選項可以解決這個問題。在html指令中使用ng-if條件或將整個控制器封裝在if命令中,該命令檢查全局變量以查看數據是否已加載並顯示加載屏幕並阻止用戶輸入並在超時後返回錯誤。

我非常希望瞭解是否有其他更好的解決方案。

相關問題