【问题标题】:$stateParams returning null object$stateParams 返回空对象
【发布时间】:2016-10-05 20:47:32
【问题描述】:

我正在尝试从 URL 获取纬度和经度变量并将它们分配给 Google 地图的“中心”属性。我没有收到任何错误,但我提醒我的中心对象到屏幕上,“纬度”和“经度”都为空。

这是网页:http://alainwebdesign.ca/pl4#/49.2/-122.6

Javascript:

(function (window, ng) {
    ng.module('app', ['uiGmapgoogle-maps', 'ui.router'])



  .config(function ($stateProvider) {
      $stateProvider.state('location', {
          url: '/:lat/:lon',
          templateUrl: 'searchRadius.html',
          controller: 'MapsCtrl',

          resolve: {
              resolveMap: function (MapService, $stateParams) {
                  return MapService.getData($stateParams.lat, $stateParams.lon);
              }
          }
      });

  })

  .config(['uiGmapGoogleMapApiProvider', function (GoogleMapApi) {
      GoogleMapApi.configure({
          key: 'AIzaSyCbRPhVlxgVwBC0bBOgyB-Dn_K8ONrxb_g',
          v: '3',
          libraries: 'weather,geometry,visualization'
      });
  } ])


    .controller('MapsCtrl', ['$scope', "uiGmapLogger", "uiGmapGoogleMapApi", "$interval", "$state", "$stateParams",
      function ($scope, $log, GoogleMapApi, $interval, $state, $stateParams) {
          $log.currentLevel = $log.LEVELS.debug;
          var center = { latitude: parseFloat($stateParams.lat), longitude: parseFloat($stateParams.lon) };
          alert(JSON.stringify(center));
          //Object.freeze(center); caused TypeError: Cannot assign to read only property ('latitude') ...

          console.log($stateParams);

          $scope.map = {
              center: center,
              pan: false,
              zoom: 16,
              refresh: false,
              events: {},
              bounds: {}
          };

          $scope.map.circle = {
              id: 1,
              center: center,
              radius: 500, //(current time - date lost)*km/hour
              stroke: {
                  color: '#08B21F',
                  weight: 2,
                  opacity: 1
              },

              fill: {
                  color: '#08B21F',
                  opacity: 0.5
              },
              geodesic: false, // optional: defaults to false
              draggable: false, // optional: defaults to false
              clickable: true, // optional: defaults to true
              editable: false, // optional: defaults to false
              visible: true, // optional: defaults to true
              events: {
                  dblclick: function () {
                      $log.debug("circle dblclick");
                  },
                  radius_changed: function (gObject) {
                      var radius = gObject.getRadius();
                      $log.debug("circle radius radius_changed " + radius);
                  }
              }
          }





          //Increase Radius:
          $interval(function () {
              $scope.map.circle.radius += 30; //dynamic var
              $state.transitionTo('location', { //location is the state name
                  center: $stateParams.center,
                  radius: $scope.map.circle.radius
              },
    {
        notify: false
    });
          }, 1000); //end of interval function


      } ]); //end of controller

})(window, angular);

searchRadius.html:

<div style="height: 100%"> <!--took out: ng-if="map.center !== undefined"-->
    <ui-gmap-google-map 
                        center='map.center'
                        zoom='map.zoom'
                        draggable='map.draggable'
                        dragging='map.dragging'
                        refresh='map.refresh'
                        options='map.options'
                        events='map.events'
                        pan='map.pan'>


        <ui-gmap-circle 
                        center='map.circle.center'
                        radius='map.circle.radius'
                        fill='map.circle.fill'
                        stroke='map.circle.stroke'
                        clickable='map.circle.clickable'
                        draggable='map.circle.draggable'
                        editable='map.circle.editable'
                        visible='map.circle.visible'
                        events='map.circle.events'>

        </ui-gmap-circle>


    </ui-gmap-google-map>

</div>

index.html:

   <!DOCTYPE html>
<html ng-app="app">

    <head>
    <link rel="stylesheet" href="example/assets/stylesheets/example.css">
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
    <script src="website_libs/dev_deps.js"></script>
    <script src="https://code.angularjs.org/1.3.6/angular.js"></script>
    <script src="dist/angular-ui-router.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.underscore.js"></script>
    <script src="http://cdn.rawgit.com/nmccready/angular-simple-logger/0.0.1/dist/index.js"></script><script src="dist/angular-google-maps_dev_mapped.js"></script>
    <script src="getLoc.js"></script>
    <script src="searchRadius.js"></script>

    <script src='//maps.googleapis.com/maps/api/js?key=AIzaSyD_g7xCYEi-U54SYfTXQ_lukRsChkWgjXQ'></script>

    <title>Pet Locate</title>

    <!--NEW STUFF FROM TOM-->


</head>

    <body style="height: 100%">
        <ui-view></ui-view>
    </body>

</html>

【问题讨论】:

  • 您是否尝试记录$stateParams?尝试删除parseFloat()?
  • @charlietfl 是的,我已经在记录 $stateParams(它在 searchradius.js 的一半左右)并且刚刚尝试取出 parseFloat() 并导致“找不到有效的中心属性”错误。
  • 在你的状态路由配置中,添加这个return MapService.getData($stateParams.lat, $stateParams.lon).then(function(rsp){ console.log(rsp); return rsp; }).catch(function(err){console.log(err);})。看看这是否说明了什么。也只是为了咯咯笑,控制台也将 $stateParams 记录在该块中,以确保您没有那么远的错误。
  • 也只是一个 FYI,你没有将 resolveMap 作为可注入的对象传递给你的控制器。
  • @jusopi 我在 .config 的解析函数中添加了该代码,但它没有做任何事情(或将任何内容记录到控制台)。感谢您的建议,将其作为可注射添加到我的控制器中,我是否只需执行以下操作: .controller('MapsCtrl', ['resolveMap', ...]

标签: javascript angularjs state


【解决方案1】:

您的问题是您没有使用&lt;ui-view&gt;,并且使用ng-controller 在页面中拥有该路由的模板。

然后你使用 index.html 作为路由的模板。

实际上,您有 2 个控制器实例,并且应用程序在路由方面根本没有正确设置

在 index.html 中运行的主要 ng-controller 实例将不管路由如何运行,这就是它不等待 $stateParams 或路由更改的原因

根据路由器文档使用它自己的模板设置页面,并且 index.html 中只有一个&lt;ui-view&gt;

【讨论】:

  • 哦,好的,谢谢您的建议,我会尝试并发布发生的情况。
  • 我编辑了问题以显示我的新设置。我将我的 index.html 文件复制到一个新的 searchRadius.html 文件中,并将模板更改为 searchRadius.html,然后在 index.html 中添加 。至于正确设置页面以进行路由,我正在密切关注我的教科书。当您说无论路由是什么控制器都会运行时,您能否告诉我您的意思?
  • 这意味着当您在路由配置中声明控制器时,您也不会使用ng-controller。每个都会创建新实例。所以当它在索引中时......它对这条路线一无所知ng-controller
  • 所以我还应该在我的第一个 .config 中使用 ng-controller 和 .controller 以便创建 2 个实例?我该怎么做?
  • 没有...一个或另一个。最好使用路由来设置它,然后如果您执行 resolve 它可以注入到该控制器实例中。无法将路由解析注入ng-controller
猜你喜欢
  • 1970-01-01
  • 2014-09-29
  • 2015-02-11
  • 2020-12-21
  • 2019-04-08
  • 2012-02-22
  • 2019-07-17
  • 2018-08-03
  • 2022-01-11
相关资源
最近更新 更多