2012-12-29 34 views
8

我是新來的角,所以也許我失去了一些東西。基於回調的Angularjs ng顯示

在我的註冊表單上我需要用戶的位置。根據他們是否允許/支持navigator.geolocation,我想顯示一個下拉選擇一個位置。

控制器。

$scope.showLoc = true; 
if(navigator && navigator.geolocation){ 
    navigator.geolocation.getCurrentPosition(function(pos){ 
     $scope.showLoc = false; 
    },function(err){ 
     $scope.showLoc = true; 
    }); 
} 

和我的形式:

<form class="form-horizontal" name="register" ng-controller="RegisterCtrl" ng-submit="registerUser()"> .... 
<div ng-show="showLoc" accesskey=""> 
    test 
</div> 
.... 
</form> 

這種方法不是爲我工作。任何洞察力將不勝感激。

+0

從一眼,我看不出有什麼問題。你能創建一個http://jsfiddle.net嗎? – Dogbert

+0

在窗體內部(例如,在關閉''之前),將{{showLoc}}放在範圍屬性設置爲您所期望的值的位置。 –

+0

已創建jsFiddle http://jsfiddle.net/yLFNP/ – Maleck13

回答

14

每當你在angularjs之外做某種形式的操作時,比如用jquery做一個ajax調用,或者像你的例子一樣抓取地理位置,你需要讓angular知道自己更新。我看着你的jsfiddle並改變了一些代碼的到處尋找這樣的:

var app = angular.module('myApp', []); 
app.controller('RegisterCtrl',function($scope){ 
    $scope.showLoc = false; 
    navigator.geolocation.getCurrentPosition(function(pos){ 
      $scope.showLoc = true; 
      $scope.$apply(); 
     },function(err){   
      $scope.showLoc = false; 
      $scope.$apply();    
     }); 
}); 

現在showLoc更改爲true上的更新。下面是關於使用$應用documation()方法http://docs.angularjs.org/api/ng.$rootScope.Scope#$apply

的jsfiddlehttp://jsfiddle.net/yLFNP/6/

編輯:我的回答是編輯,但我不與編輯同意。雖然你可以將$ apply方法包裝到$ scope.showLoc = false中,使它變得「更短」。你真的只保存1個字符(分號)。另外,我傾向於在一堆邏輯之後喜歡$ apply方法,而不是將所有內容都包含進去。如果有更多的東西,我做的範圍,你或者可以寫入每增加一個像這樣:

$scope.$apply($scope.var1 = newValue1); 
$scope.$apply($scope.var2 = newValue2); 
$scope.$apply($scope.var2 = newValue3); 

,我覺得大材小用,或者你可以使用功能的方法:

$scope.$apply(function(){ 
    $scope.var1 = newValue1; 
    $scope.var2 = newValue2; 
    $scope.var3 = newValue3; 
}); 

或者直接需要的代碼後,「申請」:

$scope.var1 = newValue1; 
$scope.var2 = newValue2; 
$scope.var3 = newValue3; 
$scope.$apply(); 

通過做這種方法的時候,你的代碼是很容易轉移和可讀性很強。少線並不總是最好的方法。