AngularJS $ scope。$ watch对象的属性

时间:2014-06-21 17:16:35

标签: javascript angularjs

我正在尝试在$ scope上观看一个简单的对象,但我很困惑为什么以下内容总是为国家和州选择元素输出state:{value}

angular.module('app').controller('FiltersCtrl', ['$scope', 'filterRepo', function ($scope, filterRepo) {

    $scope.data = {
        lookups: {
            countries: [
                { id: 1, name: 'USA' },
                { id: 2, name: 'Canada' },
                { id: 3, name: 'Mexico' }
            ],
            states: [
                { id: 1, name: 'Oregon' },
                { id: 2, name: 'Texas' },
                { id: 3, name: 'Iowa' }
            ]
        }
    };

    $scope.query = {
        filter: {
            country: 1,
            state: 1
        }
    };

    for (var item in $scope.query.filter) {
        $scope.$watch('query.filter.' + item, function (newValue, oldValue) {
            if (newValue !== oldValue) {
                console.log(item + ' : ' + newValue);
            }
        }, false);
    }

}]);

1 个答案:

答案 0 :(得分:2)

要扩展@still_learning上的comment,只有Function具有范围,这意味着$watch语句的回调正在使用您声明的item变量在“父”功能中。但是,当调用/调用这些$ watch回调时,for循环已经更新了它们的值。 EffectiveJsItem 13)中有关于此内容的项目。

一个很好的答案是通过.forEach使用函数闭包的强大功能。两个缺点:

  1. 仅适用于Array s
  2. 仅限最新的浏览器
  3. Angular提供了一种非常方便的方法来解决angular.forEach中的这两个问题。

    所有这些听起来可能都很粗糙:)但是看看它在小提琴中的作用:http://jsfiddle.net/E62VE/3/