2015-12-14 22 views
8

Tôi rất mới với Angular và Nodejs và nghĩ rằng đây sẽ là một dự án thú vị để thử. Tôi đang cố gắng lấy dữ liệu json từ http.get trong angular.js và đặt nó vào một thành phố biến để nó có thể hiển thị trên bản đồ google.Lấy dữ liệu http.get vào biến mảng JSON cục bộ

Khi tôi cố gắng console.log(cities);, nó trả về một đối tượng nhưng console.log(cities.items) trả về và không xác định;

Khi tôi cố gắng xem liệu tôi có thể JSON.stringify dữ liệu bên trong $http.get nó hiển thị dữ liệu dưới đây là những gì tôi đang cố gắng hoàn thành. Có cách nào khác để có được dữ liệu này vào các thành phố var vì vậy tôi có thể sử dụng nó như hình dưới đây?

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

Any help is appreicated rất

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> 

app.js

//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); 

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

bạn có thể làm cho một fiddle JS ra khỏi nó ..? vì bạn chưa hiển thị mã điều khiển hoàn chỉnh của mình ở đây – Minato

Trả lời

2

Cố gắng tạo ra các dấu hiệu không đồng bộ, một cái gì đó giống như

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

$http.get lợi nhuận hứa hẹn đối tượng .. vì thế khi bạn gán $http.get đến các thành phố của nó không phải là dữ liệu trả về bởi máy chủ của nó chỉ là đối tượng hứa hẹn .. những gì bạn đã làm ngay trong cuộc gọi success của mình nơi bạn đã thực hiện $scope.items = data.items; đây là callback nơi bạn lấy dữ liệu từ máy chủ .. chào mừng bạn đến với thế giới của Async

một giải pháp có thể là đặt tất cả mã của bạn sử dụng cities.items bên trong success gọi lại nhưng đó sẽ là mã bẩn. Nhưng bạn sẽ có được ý tưởng ..

Các vấn đề liên quan