TypeScript、AngularJS 和 GoogleMaps API:范围问题?

Posted

技术标签:

【中文标题】TypeScript、AngularJS 和 GoogleMaps API:范围问题?【英文标题】:TypeScript, AngularJS and GoogleMaps API: scope issue? 【发布时间】:2016-11-07 19:48:12 【问题描述】:

我有一个处理一些基本 GoogleMaps API javascript 的 MainController。我坚持的一点是$scope.clock,它是 main.html 页面某处的 AngularJS 元素:<div><h5>clock</h5></div>

它首先在constructor 内部初始化,并在触发事件bounds_changed 后更新(代码底部)。

现在我不明白的是以下两件事:

为什么console.log($scope)$scope.clock 更新为'Bye Bye' 之前显示$scope.clock = 'Bye Bye'?不应该是$scope.clock = 'Hi'吗?

为什么<div><h5>clock</h5></div> 元素没有更新为'Bye Bye',但它仍然显示初始化时的旧值'Hi'

class MainController 

constructor($http, $scope, $timeout, socket) 
    var $this = this;
    $scope.clock = 'Hi';
    $this.doSomething($this, $scope, 'Hi');


doSomething = function ($this, $scope, smth) 
    $this.initialiseMap($this, $scope, $timeout);
;

initialiseMap = function ($this, $scope, $timeout) 
    // Use AngularJS’s timer service $timeout and put a delay of 100ms before the map’s initialization  
    $timeout(function()
        // Initialise the Google map
        $scope.map = new google.maps.Map(document.getElementById('map'), 
            zoom: 11
            , center: 
                lat: -33.8675
                , lng: 151.2070
            
        );
        // Initialise the Geocoder
        var geocoder = new google.maps.Geocoder;
       // Initialise Searchbox: Create the search box and link it to the UI element.
      $scope.input = document.getElementById('pacinput');
      $scope.searchBox = new google.maps.places.SearchBox($scope.input);
      $scope.map.controls[google.maps.ControlPosition.TOP_LEFT].push($scope.input);      

      // Searchbox: Bias the SearchBox results towards current map's viewport.
      $scope.map.addListener('bounds_changed', function () $scope.searchBox.setBounds($scope.map.getBounds());
          console.log($scope);
          $scope.clock = 'Bye Bye';); // clock does not get updated in the HTML page!
    ,100);
;

【问题讨论】:

【参考方案1】:

$scope.map.addListener('bounds_changed',

angular 1.x 中的一个常见问题。你有一个事件监听器本质上是角度不知道所以回调不参与摘要周期。

修复:将$scope.$apply(); 添加到您的处理程序

更多

https://docs.angularjs.org/guide/scope

【讨论】:

非常感谢这个巴萨拉特。现在我看到你的名字,就好像我在 YouTube 上看过你的一些教程。

以上是关于TypeScript、AngularJS 和 GoogleMaps API:范围问题?的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript、AngularJS 和 GoogleMaps API:范围问题?

AngularJS 和 Typescript:如何将类/类型分配为指令的控制器?

迈向angularjs2系列:typescript指南

Chutzpah - 使用 jasmine 和 TypeScript 进行 AngularJS 测试

使用 TypeScript 和注入的 AngularJS 过滤器

Typescript 和 AngularJS 1.5:如何处理导出类