2015-12-14 14 views
8

私はAngularとNodejsの新機能で、試してみると楽しいプロジェクトだと思っていました。私はangular.js内のhttp.getからjsonデータを取得しようとしており、Googleマップに表示できるように変数都市に配置しています。ローカルのJSON配列変数にhttp.getデータを取得する

私はconsole.log(cities);にしようとするとオブジェクトを返しますが、console.log(cities.items)は返され、未定義です。

私がJSON.stringifyの中のデータを見ることができたら、$http.getのデータは、私が達成しようとしているデータが表示されます。このデータをvar都市に取得する別の方法はありますか?私は以下のようにそれを使用できますか?

{ 
     "city": "New York", 
     "state": "NY", 
     "desc": "Google NYC", 
     "lat": 40.7418, 
     "long": -74.0045 
    } 

すべてのヘルプは大

angular.js

//Angular App Module and Controller 
var sampleApp = angular.module('mapsApp', []); 

    var cities = $http.get('/locations').success(function (data){ 
    $scope.items = data.items; 
    }) 

    var mapOptions = { 
     zoom: 8, 
     center: new google.maps.LatLng(41.5, -73), 
     mapTypeId: google.maps.MapTypeId.TERRAIN 
    } 

    $scope.map = new google.maps.Map(document.getElementById('map'), mapOptions); 

    $scope.markers = []; 

    var infoWindow = new google.maps.InfoWindow(); 

    var createMarker = function (info) { 

     var marker = new google.maps.Marker({ 
      map: $scope.map, 
      position: new google.maps.LatLng(info.lat, info.long), 
      title: info.city 
     }); 
     marker.content = '<div class="infoWindowContent">' + info.desc +   '</div>'; 

     google.maps.event.addListener(marker, 'click', function() { 
      infoWindow.setContent('<h2>' + marker.title + '</h2>' + marker.content); 
      infoWindow.open($scope.map, marker); 
     }); 
     $scope.markers.push(marker); 
    } 

    for (i = 0; i < cities.length; i++) { 
     createMarker(cities[i]); 
    } 
    $scope.openInfoWindow = function (e, selectedMarker) { 
     e.preventDefault(); 
     google.maps.event.trigger(selectedMarker, 'click'); 
    } 
}); 

googleMaps.html

<!DOCTYPE html> 
<html ng-app="mapsApp"> 
<head> 
    <meta charset="ISO-8859-1"> 
    <title>Insert title here</title> 
    <link rel="stylesheet" href="css/maps.css"> 
    <script   src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.3/angular.min.js"> </script> 
    <script 
      src="http://maps.googleapis.com/maps/api/js?sensor=false&language=en"></script> 
    <script type="text/javascript" src="js/maps.js"></script> 
</head> 
<body> 
<div ng-controller="MapCtrl"> 
    <div id="map"></div> 
    <div id="repeat" ng-repeat="marker in markers | orderBy : 'title'"> 
     <a id="country_container" href="#" ng-click="openInfoWindow($event, marker)"> 
      <label id="names" >{{marker.title}}</label></a> 
    </div> 
    <ul> 
     <li ng-repeat="item in items"> 
      {{item}} 
     </li> 
    </ul> 
</div> 
</body> 
</html> 

//Rest HTTP stuff 
var express = require('express'); 
var bodyParser = require('body-parser'); 
var dbGoogle = require('./dbGoogle'); 
var app = express(); 

// configure body parser 
app.use(bodyParser.urlencoded({extended: true})); 
app.use(bodyParser.json()); 

var port = process.env.PORT || 8080; // set our port 

// create our router 
var router = express.Router(); 

// middleware to use for all requests 
router.use(function (req, res, next) { 
    // do logging 
console.log('Incoming request..'); 
next(); 
}); 

// test route to make sure everything is working 
router.get('/', function (req, res) { 
res.json({message: 'Welcome!'}); 
}); 
router.route('/locations') 

// get all the locations 
.get(function (req, res) { 
     dbGoogle.getGoogles(function (err, data) { 
      if (data) { 
       res.json({ 
        status: '200', 
        items: data 
       }); 
      } else { 
       res.json(404, {status: err}); 
      } 
     }); 
    }) 
// Register routes 
app.use('', router); 

//Serve static content files 
app.use(express.static('public')); 

// START THE SERVER 
app.listen(port); 
console.log('Running on port ' + port); 
をapp.jsをappreicatedされます

db.js

var mysql = require('mysql'); 
var app = require('./app.js'); 

var pool = mysql.createPool ({ 
    host: 'localhost', 
    user: 'root', 
    port: 3306, 
    password: 'password', 
    database: 'testdb' 
}); 

module.exports.pool = pool; 

pool.getConnection(function(err){ 
    if(!err) { 
     console.log("Database is connected\n\n"); 
    } else { 
     console.log(err); 
    } 
}); 

dbGoogle.js

var db = require('./db.js'); 

var getGoogles = function getGoogles(callback) { 
    db.pool.getConnection(function (err, connection) { 
     // Use the connection 
     connection.query('SELECT * FROM locations', function(err, results){ 
      if (!err) { 
       if (results != null) { 
        callback(null, results); 
       } else { 
        callback(err, null); 
       } 
      } else { 
       callback(err, null); 
      } 
      //release 
      connection.release(); 
     }); 

    }); 
} 

module.exports.getGoogles = getGoogles; 
+0

のようなものは、あなたがそれからJSのフィドルを作ることができ、非同期マーカーを作成してみ..?完全なコントローラコードをここに表示していないので – Minato

答えて

2

$http.get('/locations').success(function (data){ 
    angular.forEach(data.items, function(item) { 
     createMarker(item); 
    }); 
}) 
1

$http.get戻りオブジェクトを約束するので...そう、あなたがそのないデータがサーバにそのちょうど約束のオブジェクトによって返された都市への$http.getを割り当てますあなたが行ったことはコールバックにありました。$scope.items = data.items;これはサーバからデータを取得するcallbackです。Asyncの世界にようこそ

cities.itemssuccessコールバック内で使用するすべてのコードを配置することが1つの解決策になる可能性がありますが、それは汚れたコードになります。しかし、あなたのアイデアを得る。..

関連する問題