2

爲什麼我無法控制輸出$ scope值?我試圖從頁面中提取用戶分配的值並在控制器中進行檢索。最終我想通過此服務,以便多個控制器可以訪問這些數據。

HTML

<!DOCTYPE html> 
<html lang="en-us" ng-app="myApp"> 
    <head> 
      <meta http-equiv="X-UA-Compatible" content="IE=Edge"> 
      <meta charset="UTF-8"> 
      <link rel="stylesheet" href="css/bootstrap.min.css" />  
      <!-- CDN lib files --> 
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" /> 
      <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.8/angular.min.js"></script> 
      <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.8/angular-animate.js"></script> 
      <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/1.1.0/ui-bootstrap-tpls.min.js"></script>  

      <!-- custom angular script --> 
      <script src="js/app.js"></script> 
    </head> 
    <body> 
     <div class="container"> 
      <div ng-controller="mainController"> 
       <h1>Hello world!</h1> 
       <label> Please enter something</label> 
       <input textarea ng-model="name"></input> 
       <h4> This is what you entered : {{ name }} </h4> 
       <h4 style=color:red> now filtering: {{ lower() }}</h4> 
      </div> 
     </div> 
    </body> 
</html> 

APP.JS

var myApp = angular.module('myApp', []); 

myApp.controller('mainController', ['$scope', '$filter', function($scope, $filter) { 

    $scope.name = 'Test '; 
    $scope.lower = function(){ 
     return $filter('lowercase')($scope.name); 
    } 

    $scope.name = $scope.lower(); 

    console.log($scope.name); 
    console.log($scope.lower()); 

}]); 

控制檯將在初始化,但用戶後不做出改變輸出值。

enter image description here

+0

屏幕模型正在改變,因爲雙向數據綁定正在觀察範圍。但是在console.log()的情況下,如果您想要控制模型值,則需要手動設置監視器。 – Big

回答

2

你只是從構造記錄。如果你想每次有新的變化進行記錄,考慮手錶:

$scope.$watch("name", function() { 
    console.log($scope.name);   
} 
+0

@Carlton,秒殺我。 :-) –

+0

不錯的答案:-) – Carlton

1

爲什麼你會想到一個控制器中,當範圍變量的變化重新描繪?您可以使用示波器觀察器或輸入事件偵聽器來偵聽更改。

這裏是一個觀察者的例子:

var myApp = angular.module('myApp', []); 
 

 
myApp.controller('mainController', ['$scope', '$filter', function($scope, $filter) { 
 

 
    $scope.name = 'Test '; 
 
    $scope.lower = function(){ 
 
     return $filter('lowercase')($scope.name); 
 
    } 
 

 
    $scope.name = $scope.lower(); 
 

 
    console.log($scope.name); 
 
    console.log($scope.lower()); 
 
    
 
    $scope.$watch('name', function() { 
 
     console.log($scope.name); 
 
     console.log($scope.lower()); 
 
    }); 
 

 
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="myApp" class="container"> 
 
    <div ng-controller="mainController"> 
 
    <h1>Hello world!</h1> 
 
    <label>Please enter something</label> 
 
    <input textarea ng-model="name" /> 
 
    <h4> This is what you entered : {{ name }} </h4> 
 
    <h4 style=color:red> now filtering: {{ lower() }}</h4> 
 
    </div> 
 
</div>

3

只是更多的 「功能性」 的版本。每個人都是對的,你在記錄可觀察的事物,而不是觀察到的事物。你想要的是console.log在每次更改爲$scope時都會被調用,不會調用一次(就像你現在這樣做)。

$scope.$watch("name", console.log);