2014-11-04 67 views
4

我試圖更改範圍變量:$scope.tab每次窗口調整和$scope.tab == 'more'Angularjs更改範圍變量窗口調整大小

代碼:

$scope.closeMoreTab = function() { 
    if($scope.tab == 'more') 
     $scope.tab = 'extras'; 
}; 

angular.element($window).bind('resize', function() { 
    $scope.closeMoreTab(); 
}); 

嗯,這真的叫$scope.closeMoreTab(),它真的改變了$scope.tab變量,但實際上,它並沒有改變在視圖上任何東西。

我想:

console.log($scope); 

要檢查變量tab,它真的變成「演員」,但是當我做:

<div>{{ tab }}</div> 

這讓我發現,當前選項卡的變量仍然是'more'

請幫忙。我用這種方法幹了1小時,不知道爲什麼會發生或做什麼。

非常感謝

+0

你可以發佈你的代碼到jsfiddle或plunker嗎? – 2014-11-04 13:37:44

回答

6

你應該換你$scope.closeMoreTab();$scope.$apply功能,因爲這目前值發生變化,但不會觸發消化週期:

angular.element($window).bind('resize', function() { 
    $scope.$apply(function() { 
     $scope.closeMoreTab(); 
    }); 
}); 
+2

使用'$ timeout'而不是'$ scope。$ apply'更安全。 '$ scope。$ apply'可能導致消化問題。 – 2014-11-04 13:43:00

+1

@KursadGulseven它可以但通常,知道它使用的上下文。在這種情況下,它被稱爲角度外的安全。如果這種情況有時可能被稱爲有棱角的世界,有時甚至不會,那麼超時可能是更好的選擇。 – dchhetri 2014-11-04 13:56:07

+1

確認正確與[此JSFiddle](http://jsfiddle.net/troygizzi/0owft2cs/)。但是,我還爲OP考慮了另外兩個小改動:(1)在處理頻繁觸發的事件(如調整窗口大小)時作爲「最佳實踐」的調節示例;(2)解除綁定事件處理程序的示例即「冪等」,因此只有在第一次被觸發時才需要被調用。請注意,限制示例在該小提琴中被註釋掉,因爲對於這種特殊情況,解除綁定比僅僅限制更有意義。 – 2014-11-04 14:24:49

-1

您可以嘗試變量添加到$watch,因爲每當變量$apply的值發生變化時,調用$apply將處理$digest週期。