角度不更新中的数据绑定和父范围

时间:2016-10-06 23:02:50

标签: javascript angularjs

所以我在一直遇到的问题上取得了进展,但我不知道从哪里开始。

在我的代码中,我有一个模块,然后是模块外部的指令,但它是注入的。

我在父作用域中有一个名为registrants的对象。当我启动指令时,指令中的任何活动都会修改父作用域,registrants将更新。但是,我有另一个变量registrantCount应该更新,因为注册人列表长度增加但不是。有人能解释一下为什么吗?

以下是我的代码片段,其中包含以下所有相关的peices,如果有一个变量显示我在上面的描述中没有提到,为了完成,假设数据是正确的。我唯一关注的变量是我在最初的问题陈述中提到的两个变量。

模块

angular.module('register', [])
.controller('Register', function($scope, $rootScope, $http){
    $scope.registrants = {};
    $scope.registrantCount = 0;

    $http({
        url : 'apiLink for initial data'
    }).then(function(data){
        $scope.employeeList = data.data.payload[0]; // initial list to allow the directive to function
    });
});

指令

angular.module('register.check', [])
.directive('attendees', function($http){
    return {
        restrict : 'EA',
        scope : false,
        templateUrl : 'template',
        link : function(scope, elem, attrs){
            angular.forEach(companies, function(c, key){
                if(c.companyID == id){
                   scope.registrants = c.registrants; // this object is modified in the directive template
                   scope.registrantCount = scope.registrants.length; // this variable is located in the parent template, not the directive template
                }
            });
        })
     };   
});

请再次注意,该指令将修改注册人的父范围对象,但它不会修改注册人计数,如果我在指令中修改它,它也不会在父变量中生成正确的长度。我对此事感到非常困惑。感谢您提前获得所有帮助!

1 个答案:

答案 0 :(得分:1)

请查看this post,以便更深入地了解正在发生的事情,但简而言之:

Angular中的绑定可能有点棘手。因为$scope.registrants是一个对象,所以子范围(您的指令)直接引用它 - 它指向同一个对象。因为$scope.registrantsCount是一个整数(认为它是一个基本类型),你的指令为它创建一个单独的变量,并且双向绑定被破坏。

两个选项:按照miqid的建议,创建一个包含registrantsCount的对象:

$scope.registrantsCount = { count: 0 }

并在指令中更新它:

scope.registrantsCount.count = scope.registrants.length;

...或在控制器中创建一个函数并从指令中调用它:

// in controller
$scope.registrantsCount = 0;
$scope.updateRegistrantsCount = function(count) {
    $scope.registrantsCount = count;
}
// in directive
scope.updateRegistrantsCount(c.registrants.length);

我更喜欢后者。