2012-12-19 110 views
0

我可以使用帶JSONP的Angular JS $資源從Google Finance獲取股票價格。這是顯示在這裏:http://jsfiddle.net/8zVxH/1/

我需要谷歌沒有提供,但雅虎的歷史價格。我修改了上面的jsfiddle這個:http://jsfiddle.net/curt00/BqtzB/

下面的代碼:

angular.module('app', ['ngResource']); 

function AppCtrl($scope, $resource) { 

    var yqlURL="http://query.yahooapis.com/v1/public/yql?q="; 

    var dataFormat="&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys"; 

    var symbol = 'GOOG'; 

    var startDate = '2012-12-05'; 
    var endDate = '2012-12-06'; 

    var historical_query = yqlURL+"select%20*%20from%20yahoo.finance.historicaldata%20where%20symbol%20%3D%20%22"+ symbol +"%22%20and%20startDate%20%3D%20%22"+ startDate +"%22%20and%20endDate%20%3D%20%22"+ endDate +"%22"+ dataFormat; 

    $scope.yahooFinance = $resource(historical_query, 
           {callback:'JSON_CALLBACK'}, 
           {get: {method:'JSONP', isArray: false}}); 

    $scope.indexResult = $scope.yahooFinance.get(); 

} 

它在瀏覽器控制檯產生錯誤消息:

GET http://query.yahooapis.com/v1/public/yql?q=select%20 *%20from%20yahoo.finance。 historicaldata%20where%20symbol%20%3D%20%22GOOG%22%20於是%20startDate%20%3D%20%222012-12-05%22%20於是%20endDate%20%3D%20%222012-12-06% 22 & format = json & env = store%3A%2F%2Fdatatables.org%2Falltableswithkeys?callback = angular.callbacks._0 400(Bad Req uest)

有沒有人知道如何讓這個工作?

我知道JQuery的getJSON可以用於這個Yahoo查詢,但據說AngularJS的$資源更快,更高效。

回答

3

使用angular的$ http服務。

使用角度服務$ http的函數jsonp很容易實現。

服務

變種應用= angular.module( '對myApp',[]);

app.factory('service', function($q, $http) { 

    return { 
     getHistoricalData: function(symbol, start, end) { 
      var deferred = $q.defer(); 
      var format = '&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=JSON_CALLBACK'; 
      var query = 'select * from yahoo.finance.historicaldata where symbol = "' + symbol + '" and startDate = "' + start + '" and endDate = "' + end + '"'; 
      var url = 'http://query.yahooapis.com/v1/public/yql?q=' + encodeURIComponent(query) + format; 

      $http.jsonp(url).success(function(json) { 
       var quotes = json.query.results.quote; 
       // filter + format quotes here if you want 
       deferred.resolve(quotes); 
      }); 
      return deferred.promise; 
     } 
    }; 
}); 

控制器

function Ctrl($scope, service) { 
    $scope.symbol = "GOOG"; 
    $scope.items = []; 
    $scope.startDate = '2012-12-05'; 
    $scope.endDate = '2012-12-06'; 

    $scope.getData = function() { 
     $scope.items = []; 

     var promise = service.getHistoricalData($scope.symbol, $scope.startDate, $scope.endDate); 

     promise.then(function(data) { 
      $scope.items = data; 
     }); 
    }; 
    $scope.getData(); 
}​ 

我已經創建了jsFiddle工作的例子。

+0

感謝您的建議。這很有幫助。但是,它返回NULL。這通過在瀏覽器中輸入url來確認。此外,以'ichart.yahoo.com'開頭的網址會爲每個歷史日期下載價格,而不僅僅是從和到之間的日期。我不得不做一些改變,可以在這裏看到:http://jsfiddle.net/curt00/XY89Y/1/。你的「getHistoricalData:function」和「$ log.info」導致錯誤。那些JavaScript命令? – Curt

+0

這是一個自定義(角度)服務的一部分 – asgoth

+0

我在你的幫助下取得了進步。現在,我試圖在返回到我稱爲getHistoricalData函數的位置後訪問histData對象中的數據。請參閱我發佈的代碼在http://stackoverflow.com/questions/13979324/cannot-access-elements-in-object-returned-by-javascript-function-in-angularjs – Curt

0

感謝大家提供的建議。

@ asgoth的建議看起來很漂亮,但我無法讓它在我的AngularJS web應用程序上工作。

我用$ http.jsonp替換了$ resource,現在它可以工作。例如:

var query = 'select * from csv where url=\'http://ichart.yahoo.com/table.csv?s=' + symbol + '&a=' + (date.month - 1) + '&b=' + date.day + '&c=' + date.year + '&d=' + (date.month - 1) + '&e=' + date.day + '&f=' + date.year + '&g=d&ignore=.csv\''; 
var url = 'http://query.yahooapis.com/v1/public/yql?q=' + fixedEncodeURIComponent(query) + '&format=json&callback=JSON_CALLBACK'; 

    $http.jsonp(url, {timeout: 30000}).success(function(json) { 
     var result = json.query.results.row; 
     // process result 
    } 
1

作爲angularjs小白,這個固定爲我。

改變了我的jsonp來自:

JSON_CALLBACK({"term_jg_1":{"query":"Julia....... 

angular.callbacks._0({"term_jg_1":{"query":"Julia... 
+0

請確保格式化代碼片段。 – bcr