Angular,观察变化的范围

时间:2015-01-29 00:43:35

标签: javascript angularjs

我正在尝试观看一个示波器,这样我每次都可以重新运行一个功能,而且它似乎没有起作用我是如何想象的那样。

所以我只有

 $scope.user = userFactory.getUser();

我的用户被从工厂拉入

然后在点击功能中,我通过让用户点击这样的按钮将其更改为其他内容

 $scope.swapUserTest = function(){
  $scope.user = {'name' : 'new'}
}

然后我试着去观看它是否发生了变化 - 这不仅仅是在点击中,未来它将来自多个不同的东西所以我希望看到它,所以每当它改变我的功能火灾。像这样:

$scope.$watch($scope.user, function() {
  console.log("changed")
});

所以我假设,每当$ scope.user更改时,这会触发,但它似乎只是在它首次从工厂进入控制器时触发。可以在这里使用一些指导。谢谢!

2 个答案:

答案 0 :(得分:4)

您可以指定对象的属性:

$scope.$watch('user', function(newValue, oldValue) {
    // do something
});

或者您可以指定一个返回您正在观看的值的函数:

$scope.$watch(function () {
    return $scope.user;
}, function(newValue, oldValue) {
    // do something
});

答案 1 :(得分:1)

要观察范围的属性,请将其设置为$ watch函数的第一个参数。注意:当您观察对象时,只有在整个对象发生更改时才会调用手表,而不是在该对象的属性发生更改时调用。 E.g:

$scope.user = {"username": "john", "email": "john@smith.com"};
$scope.$watch("user", function(user) {
    console.log("users email now is:", user.email);
});

$timeout(function() {
    $scope.user = {"username": "jack", "email": "jack@rocks.com"};
}, 1000);

$timeout(function() {
    $scope.user.email = "jim@beam.com";
}, 2000);

//  after one second console outputs
// jack@rocks.com
//after 2 seconds ... nothing, even though user object's email has changed.

To"深度观察"一个对象,将$ watch的第三个参数设置为true。 $ watch(" property_name",callback_function,true);

或者,当您想要观看对象的特定属性时,请使用

$scope.$watch("user.email", function(email) {
    console.log("user.email watch called with:", email);
});
/* 
outputs both 
user.email watch called with: jack@rocks.com
users.js:60 user.email watch called with: jim@beam.com
*/