2014-11-13 292 views
5

我正在構建一個webapp,我第一次使用angular。我昨天試圖從一個API獲取數據,但它不適用於跨源數據限制的Angular原因。幸運的是,我可以通過PHP中的簡單CURL請求獲取json日期。傳遞一個PHP變量爲角

所以我現在在這裏。我在PHP變量中有JSON數據,並希望在我的Angular Application中使用這些數據。我怎樣才能做到這一點?有沒有辦法將數據直接傳遞給角?或者我應該創建一個與PHP的JSON文件,然後將其加載到我的功能?你有什麼建議?

我想用php變量$ content的內容填充$ scope.posts。

這裏是PHP代碼:

<?php 


     /* gets the data from a URL */ 
     function get_data($url) { 
     $ch = curl_init(); 
     $timeout = 5; 
     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
     $data = curl_exec($ch); 
     curl_close($ch); 
     return $data; 
     } 

     $returned_content = get_data('http://fingerzeig.ch/api/agenda/list'); 
     $content = json_decode($returned_content); 
     //print_r ($content); 

     //Get first title 
     //$firstitle = $content[0] -> ID; 

     //print_r($firstitle); 



     ?> 

的角度代碼:

//MYAPP 

var app = angular.module("MyApp", []); 


app.controller("PostsCtrl", function($scope, $http) { 
    $http.get(' WHAT SHOULD GO HERE? '). 
    success(function(data, status, headers, config) { 
    console.log("success!"); 
    console.log(data); 
     $scope.posts = data; 
    }). 
    error(function(data, status, headers, config) { 
     // log error 
    }); 
}); 
+0

您是否可以控制API以允許訪問您的Angular應用程序? –

+0

@SteveAdams不,我不能控制。所以我在我的網站上已經有了這個數據。我可以迴應它和一切。但如何在我的角度應用程序中使用它? – elpeyotl

回答

9

你可以提供和使用Apache和PHP端點從您自己的服務器這樣的數據:

$http.get('/endpoint', function() { ... }); 

你也可以在DOM中做一些有時稱爲'bootstrapping'的數據。這很好 - 我通常會這樣做,以確保單頁面應用的首頁加載不需要等待初始數據。首頁加載的所有內容都設置在服務器上,並呈現在應用程序收集的頁面中,而不會提出更多請求:

要做到這一點,您可以在窗口或全局範圍上創建一個集合,如下所示:

window.myPostData = "<?php echo $data; >"; 

然後在你的應用程序後,通常可以期待window對象(或任何全局變量)是在任何時候瀏覽器中提供所以它會是這樣的訪問:

app.controller("PostsCtrl", function($scope) { 
    var posts = window.myPostData; 
}); 

但是,您可能希望能夠訪問fres H數據一樣,所以你可能會嘗試這樣的事:

// If $data is empty, set myPostData to false. 
window.myPostData = <?php echo empty($data) ? 'false' : $data; >; 

... 

app.controller("PostsCtrl", function($scope, $http) { 
    var posts = window.myPostData; 

    // Set myPostData to false so future use of this controller during this 
    // request will fetch fresh posts. 
    window.myPostData = false; 

    // Now if we didn't bootstrap any posts, or we've already used them, get them 
    // fresh from the server. 
    if (!posts) { 
     $http.get('/endpoint', function() { 
      ... 
     }); 
    } 
}); 

你要知道,如果你不具備瞭如何使用Apache和PHP建立一個端點的理解,你會想堅持只將數據引導到窗口或全局變量上。這並不理想,但它會起作用。

+0

感謝您的明確解釋。這可以幫助我! – elpeyotl

+0

不客氣 - 如果有任何問題太模糊,請隨時索取更多幫助。 –

+0

其實這裏的問題是全局變量不是一個好主意,我想把它分配爲私有變量,對此有何想法? –

0

既然你已經得到JSON數據,只輸出JSON數據。不需要做json_decode。

所以才echo $returned_content

編輯:

的一部分,你在你的角度代碼有$http.get(' WHAT SHOULD GO HERE? ')應指向PHP頁面的相對URL。例如如果你的PHP頁面在http://server.com/webapp/get_data.php訪問那麼你的角度是$http.get('/webapp/get_data.php')

+0

我知道這一點。我可以在我的網站上使用這些數據。但是,我怎麼能得到這些數據在我的角度應用程序中使用它? – elpeyotl

+0

看到我編輯的答案 – creanium

0

你可能只是迫使它到這樣的範圍,不知道這是否是最好的做法,但亞... 或者你可以有你的角度控制器調用PHP函數在

$http.get('func').then(function(data) { 
//do stuff 
}); 

或只是推它的範圍

<input ng-model="myContent" value="<?php echo $returned_content?>"/> 
4

謝謝大家的幫助。它正在工作,解決方案非常簡單。

我在Javascript中創建了一個獲取PHP返回內容的變量。

var thedata = <?php echo $returned_content;?>; 

然後我把這個變量在我的角度app文件:

//MYAPP 

var app = angular.module("MyApp", []); 

app.controller("PostsCtrl", function($scope) { 
    $scope.posts = thedata; 
    console.log(thedata); 
}); 

我可以在我的NG-重複現在訪問這些數據。

<body ng-app="MyApp"> 
    <div ng-controller="PostsCtrl"> 
    <ul ng-repeat="post in posts"> 
     <li>{{post.ID}}</li> 
    </ul> 
    </div> 
</body> 

它工作甜!很簡單的解決方案