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);