angularjs - 需要帮助来理解 Angular $watch

标签 angularjs save watch

假设我有一个专辑列表,用户可以添加专辑

controller.albumList = function($scope, albumService) {
    $scope.albums = albumService.query();

    $scope.$watch('$scope.albums',function(){
        $scope.albums.$save($scope.albums)
    })

    $scope.addalbum= function(){
        $scope.albums.objects.push(album);   
    }
};
  1. 从服务器获取专辑列表并显示它们
  2. 用户可以添加相册
  3. 查看专辑列表,发生变化时将其保存到服务器。

问题是 $watch 总是触发,我什至没有触发 addalbum 方法,每次刷新页面都会创建一个新相册。

我遵循todeMVC Angular中的代码

这里是示例代码

var todos = $scope.todos = todoStorage.get();

$scope.newTodo = '';
$scope.editedTodo = null;

$scope.$watch('todos', function () {
    $scope.remainingCount = filterFilter(todos, { completed: false }).length;
    $scope.completedCount = todos.length - $scope.remainingCount;
    $scope.allChecked = !$scope.remainingCount;
    todoStorage.put(todos);
}, true);

请帮我理解这一点

最佳答案

这是一个解决方案:

$scope.$watch('albums', function(newValue, oldValue) {
    if (angular.equals(newValue, oldValue)) {
        return;
    }

    $scope.albums.$save($scope.albums);
}

在观察程序注册到作用域后,将异步调用监听器 fn(通过 $evalAsync)来初始化观察程序。在极少数情况下,这是不希望的,因为当 watchExpression 的结果没有更改时调用监听器。要在监听器 fn 中检测这种情况,您可以比较 newVal 和 oldVal。如果这两个值相同 (===),则监听器由于初始化而被调用。

有关 $watch 监听器的更多信息:$watch at angularjs docs

关于angularjs - 需要帮助来理解 Angular $watch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17336326/

相关文章:

c++ - Visual Studio 2010 Professional 中的监视值不正确

javascript - 获取 Angular js中两个下拉值的平均值

angularjs - 注入(inject) Controller 给出空对象 AngularJS

ruby-on-rails - 将 es6 与 rails Assets 管道一起使用的最佳方法是什么

javascript - 向所有 AngularJS Controller 添加方法

file - gnuplot : how to save datafile values into a variable (with condition)?

html - 在非透明列表后面制作一个带有透明背景图像的div

C++ 控制台保存并加载保存的 "games"

database - Grails:保存到数据库而不重新加载页面

linux - Bash - 在与当前终端分开的另一个终端中启动命令的新实例