61

是否可以$watch在服务内的对象数组上设置一个(我希望$watch声明本身在服务内)?

4

4 回答 4

121

您可以通过将函数注入$rootScope并使用函数作为$watch方法的第一个参数,将任何表达式添加到监视集。伪代码:

$rootScope.$watch(function() {
  return //value to be watched;
}, function watchCallback(newValue, oldValue) {
  //react on value change here
});

不要忘记该$watch方法的第三个布尔参数。您需要指定true是否要深入观察整个对象的更改。

于 2013-07-23T09:52:29.613 回答
15

就其本质而言,服务就像类和房屋方法。您可以设置一个从控制器调用的方法,该方法的参数是范围并应用监视表达式:

app.service('myservice',function(){
    this.listen = function($scope) {
        $scope.$watch(function(){return someScopeValue},function(){
           //$scope.dosomestuff();
        });
    }
});

//your controller

function myCtrl($scope,myservice) {
    $scope.listen = function() {
        myservice.listen($scope);
    }

    //call your method
    $scope.listen();
}

更新:如果您尝试查看服务内部的私有局部变量,请使用 $rootScope 查看接受的答案。如果您尝试在本地范围内 $watch 一个 $scope 变量,那么上面是您最好的选择。他们正在实现两件截然不同的事情。

于 2014-03-25T01:13:04.413 回答
0

你能澄清你想要达到的目标吗?据我了解,您正在从服务器获取一组对象作为您的模型。然后就不清楚了:

  1. 您是否想验证数组中的某些对象是否已更改(可能自上次调用服务器以防您进行循环池)?
  2. 您是否要验证用户是否通过某些前端控制元素更改了数组中的某些对象?

在情况 1 中,您实际上并不需要使用 $watch(或者更确切地说是 $watchCollection),但您应该遍历从服务器收到的数组并验证更改(与 $watchColleciton 所做的相同)。如果对象与您当前持有的对象不同 - 您在此元素上调用 object.$save()。

在情况 2 中,在 $scope 上使用 $watchCollection() 作为参数传递给您的服务函数,或者如果您将数组保存在 $rootScope 中,则使用 $rootScope。

如果您想澄清这些场景,我可以为您提供真实的代码。

于 2014-03-25T01:51:16.367 回答
0

嘿,我刚刚遇到了一种情况,我在 2 个不同的控制器上设置了一个相当大的手表。

因为我不想复制我刚刚定义为在我的服务中运行的任何代码:

angular
    .module('invoice')
    .factory('invoiceState', function () {
        var invoice = {
            client_info: {
                lastname: "",
                firstname: "",
                email: "",
                phone: "",
                id_client: "",
                ... 
             }
        }
        invoice.watchAccommodation = function (newVal, oldVal) {
            var accommodation = newVal;
            //Whatever you would normally have in your watch function
        }

然后我可以在注入服务的任何控制器的手表中调用这个函数

function NewInvoiceCtrl(invoiceState) {
    $scope.$watch('invoice.accommodation',invoiceState.watchAccommodation, true);
}

我对 AngularJS 没有太多经验,所以我无法真正深入探讨这种方法的性能方面,但它确实有效;)

于 2018-02-27T16:48:36.747 回答