$ watch不跟踪模型变量

时间:2014-11-18 14:58:05

标签: angularjs

我的$watch未更新对模型所做的每项更改......

我在我的控制器中:

$scope.JobsLeft = ProductRepository.Model.JobsLeft;

在我的存储库(工厂)中,我通过递减数字来更改JobsLeft ...

这是我的存储库内容:

var ViewModel = function() 
{
    return {
        Products: [],
        PageCount: [],
        JobsLeft: 0
    };
}();

function JobLoaded()
{
    ViewModel.JobsLeft--;
    alert( ViewModel.JobsLeft );
}

return {
    Model: ViewModel,
    ...

一旦完成,就会在存储库函数中调用JobLoaded()。

我的控制器中有一块手表可以监视上面的内容:

$scope.$watch( "JobsLeft" , function(){
    alert( "Doesn't fire when ProductRepository.Model.JobsLeft changes" );
    if( $scope.JobsLeft <= 0 )
    {
        $( ".pagination-loading" ).hide();
    }
}, true );

任何想法我可能做错了什么?

1 个答案:

答案 0 :(得分:2)

您正在观看整数的实例。如果你的watch语句在实际的ViewModel上,那就可以了。

或者,您可以将“JobsLeft”变量设为对象 - 如下所示:

return {
        Products: [],
        PageCount: [],
        JobsLeft: { value: 0 }
    };

然后,当你写

$scope.JobsLeft = ProductRepository.Model.JobsLeft;

作用域的JobsLeft是对ViewModel中相同对象的引用,并且watch语句应该在写入时起作用:

$scope.$watch( "JobsLeft.value" , function(){
    alert( "Doesn't fire when ProductRepository.Model.JobsLeft changes" );
    if( $scope.JobsLeft.value <= 0 )
    {
        $( ".pagination-loading" ).hide();
    }
}, true );

不要忘记更改编辑JobsLeft的方式:

function JobLoaded()
{
    ViewModel.JobsLeft.value--;
    alert( ViewModel.JobsLeft.value );
}

作为旁注,将变量放入范围本身通常是一种不好的做法。通常最好将控制器用于这样的事情。