scope.watch在设置值时触发

时间:2016-09-09 16:51:16

标签: javascript angularjs

我注意到只有在值发生变化时,scope.watch才会触发。现在,为了每次我这样做时触发scope.watch:

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

module.controller("TreeCtrl", function($scope) {


    $scope.changeValue = function(){
        $scope.name = new Date();
    };

});

module.directive("tree", function($compile) {
    return {
        restrict: "E",
        template:'<div>sample</div>',
        link : function(scope, elm, $attrs) {
           scope.$watch('name', function(newVal, oldVal) {
                        console.log(scope.userName);            
                    });  
        }
    };
});

即$ scope.name = new Date();

每当设置变量时,是否有其他方法可以捕获scope.watch。

我的小费是http://jsfiddle.net/xxkgxLr9/34/

scope.watch是正确的方法吗?

我的目标是每次设置范围变量时从控制器发出一段代码

3 个答案:

答案 0 :(得分:2)

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

module.controller("TreeCtrl", function($scope) {


    $scope.changeValue = function(){
        $scope.name = new Date();
        console.log($scope.name);
    };

});

module.directive("tree", function($compile) {
    return {
        restrict: "E",
        template:'<div>sample</div>',

        link : function($scope, elm, $attrs) {
           $scope.$watch('userName', function(newVal, oldVal) {
                        console.log($scope.userName);    
                console.log($scope.name);
                    });  
        }
    };
});

答案 1 :(得分:2)

按钮和指令元素的范围是不同的。您的代码需要一些修改。 $ compile不应该作为指令函数的参数给出。

控制器中的数据使用范围传递给指令:{'name':'@'}

options && options.name || 'Buddy'

每当更改变量名称时,watch都会被触发。

答案 2 :(得分:1)

如果只能通过setter功能设置变量,你可以试试这个:

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

module.controller("TreeCtrl", function($scope) {

    $scope.changeValue = function(){
        $scope.updateName(new Date());
    };

});

module.directive("tree", function($compile) {
    return {
        restrict: "E",
        template:'<div>sample</div>',
        link : function(scope, elm, $attrs) {
           scope.updateName = function (newVal) {
               console.log(newVal);
           };
        }
    };
});