2014-06-24 71 views
1

爲什麼這不起作用?

由於角度表達式無法訪問window對象,因此我使用了$window,但以下操作不起作用。

<button ng-click="$window.alert('Hi There')">Hi There</button> 

角度表述沒有獲得像 窗口,文檔或位置的全局變量。這個限制是有意的。它可以防止意外進入全球的狀態 - 一個常見的來源 微妙的錯誤。

回答

2

您只能通過範圍調用你的控制器服務(這是分離的模板非UI邏輯的想法)

How to call a service function in AngularJS ng-click (or ng-change, ...)?

$窗口是一種服務,而像其他不直接與視圖相關的服務,它們在模板中不可訪問。

angular.module('app').controller('Controller', 
    ['$scope', '$window', function($scope, $window) { 
     $scope.alert=$window.alert 
}]); 
4

模板只能訪問放在其$scope上的變量。如果您需要使用模板訪問$window上的任何內容,則需要將$window注入控制器,並將其分配給$scope

例如

angular.module('app').controller('Controller', 
    ['$scope', '$window', function($scope, $window) { 
     $scope.$window = $window; 
}]); 

正如評論指出的那樣,你可能不希望整個$window包裝暴露在你的模板,以便更好的方法是使用一個輔助功能上$scope

ng-click="greet('Hi There')" 

angular.module('app').controller('Controller', 
    ['$scope', '$window', function($scope, $window) { 
     $scope.greet = function(message) { 
      $window.alert(message); 
     }; 
}]); 
+1

這工作,而是把整個服務到$範圍不推薦使用。請參閱http://stackoverflow.com/questions/20054028/how-to-call-a-service-function-in-angularjs-ng-click-or-ng-change瞭解更多 – edi9999

+0

您100%正確。我認爲他只是在做這個工作來玩弄框架,而不打算在生產代碼中使用它。我可以輕易承擔太多,我應該提到這不是一個好主意。我會在那裏編輯它。 – ivarni