$ Watch in a service?

时间:2013-07-23 09:38:07

标签: angularjs angularjs-service

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

4 个答案:

答案 0 :(得分:121)

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

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

不要忘记$watch方法的第三个布尔参数。如果要深度观察整个对象以进行更改,则需要指定true

答案 1 :(得分: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查看接受的答案。如果你试图在本地范围内观察一个$ scope变量而不是上面的最佳选择。他们正在完成两件截然不同的事情。

答案 2 :(得分:0)

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

  1. 是否要验证阵列中的某些对象是否已更改 (也许自从你最后一次调用服务器以防你再次出现 池)?
  2. 您想验证用户是否通过某些前端控制元素更改了阵列中的某些对象吗?
  3. 在第一种情况下,你并不需要使用$ watch(或者更确切地说是$ watchCollection),但你应该遍历从服务器收到的数组并验证更改(与watchColleciton会做的相同)。如果对象与您当前持有的对象不同 - 您可以在此元素上调用object。$ save()。

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

    如果您要澄清方案,我可以为您提供真实的代码。

答案 3 :(得分:0)

嘿,我刚刚在两个不同的控制器上安装了一个非常大的手表。

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

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没有太多经验,所以我不能真正深入研究这种方法的性能方面,但它有效;)