1

我正在用angular.js構建一個Ionic應用程序,我快完成了,但現在我遇到了一些小麻煩。無法更新angular.js中的變量

在我templates/menu.html我:

<ion-item nav-clear menu-close ng-click="filterByPeriod(weekBegin, currentDate)">Filter </ion-item> 

和我controller.js:

.controller('Home', ['$scope', '$ionicModal', '$cordovaGeolocation', function($scope, $ionicModal, $cordovaGeolocation) { 
    App = { 
    init: function() { 
     setTimeout(function(){ 
     $scope.map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions); 
     }, 200); 
    }, 
    }; 
    $scope.addMarkersToMap = function(reports, map) { 
    var newCenter = new google.maps.LatLng(reports[0].latitude, reports[0].longitude); 

    map.setCenter(newCenter); 
    map.setZoom(12); 
    } 

    $scope.filterByPeriod = function(beginDate, endDate) { 
    var cityId = window.localStorage.getItem('cityId'); 

    serviceReports.getDenunciasFromPeriod(cityId, beginDate, endDate) 
    .success(function(reports){ 
     $scope.addMarkersToMap(reports.dados, $scope.map); 
    }); 
    } 
    App.init(); 
}]); 

我已經嘗試用`$ scope.apply做到這一點(函數(){})來封裝此方法,但用這兩種方式我趕上這個錯誤:

http://cl.ly/image/200O1d2F1C46

任何人都有任何想法如何解決這個問題?

+0

的錯誤信息表明'map'內'$ scope.addMarkersToMap()'是未定義/空。仔細檢查你是否正在爲該函數調用提供一個實際對象。 – Clev3r 2014-10-01 03:24:54

+0

你可以分享你如何設置你的mapOptions嗎? – benek 2014-10-01 13:17:15

回答

0

$ scope.map未定義。這可能是因爲你沒有從谷歌地圖庫中得到任何東西,或者它還沒有填充數據。您可能想使用承諾,然後使用該變量或禁用該按鈕,直到數據在那裏。

0

您的地圖對象未正確初始化。我懷疑你的document.getElementById(「map-canvas」)不應該在控制器中正常工作:DOM操作不與角度摘要循環同步。

更喜歡使用指令,你可以看看我是如何做的:

https://github.com/bennekrouf/ng-formation/blob/master/app-directives/app/app.js

+0

嘿@benek,我想不是,一旦這個相同的方法(addMarkersToMap)以前工作,但是當filterByPeriod被調用時,我發現這個錯誤。 – 2014-10-01 12:48:11

+0

就是這樣......有時候有時候,有時候不會。在控制器中操作DOM實際上不是一種好的做法,因爲當控制器執行時,DOM不會完全加載。這就是爲什麼我們使用指令來操作DOM。你可以破解這個機制,像http://stackoverflow.com/questions/23049904/angular-js-getelementbyid-not-working-in-scope-function – benek 2014-10-01 13:21:26