AngularJs指令:value from cookie不适用于数据绑定

AngularJs directive: value from cookie does not apply to data binding

本文关键字:不适用 适用于 数据绑定 cookie from 指令 value AngularJs      更新时间:2023-09-26

我已经创建了指令,其中包含用户分配到的组织的下拉列表:

.directive('orgList', ['$rootScope', '$state', 'Auth', 'ipCookie', function ($rootScope, $state, Auth, ipCookie) {
    return {
        restrict: 'A',
        replace: true,
        template: '<div class="form-group"><div class="input-group">'+ 
            '<span class="input-group-addon"><b>My orgs</b></span>'+
             '<select class="form-control" ng-model="selectedOrg"'+
                  'ng-options="org.name for org in orgs"></select>'+
                '</div></div>',
        link: function(scope, elem, attrs) {
                scope.orgs = Auth.user.organizations;
                scope.selectedOrg = ipCookie('selectedOrg') || _.first(scope.orgs);
                scope.$watch('selectedOrg', function (value) {
                    if(!_(value).isEmpty()) {
                        ipCookie('selectedOrg', value);
                        var temp = { 
                            role: Auth.userRoles[value.role] || Auth.user.role 
                        }
                        _(Auth.user).extend(temp);
                        $rootScope.$broadcast('userRoleChanged', value.id);
                    }
                });
                scope.$on('userRoleChanged', function (event, id) {
                    if(!Auth.authorize(Auth.accessLevels.admin)) {
                        if($state.current.url.match('/organization/')) {
                            $state.go('private.profile');
                        }
                    } 
                });
            }
        }
    }
}])

现在我想让它记住用户选择:当用户在下拉菜单中选择组织时,在页面重新加载后,我希望他从cookie中看到相同的组织。

问题是什么:

scope.selectedOrg = ipCookie('selectedOrg') || _.first(scope.orgs);

如果没有定义cookie并且选择了_.first(scope.orgs)部分,则下拉框显示组织,但是如果我从cookie中获取值,则下拉框显示空文本。console.log()显示在两种情况下所选择的选项都是正确的。

最可能的原因是对象身份。

这意味着从ipCookie()服务中检索到的值可能与orgs列表中的值具有相同的内容(即字段是相同的,如果逐个比较),但对象本身在Javascript a === b意义上是不同的。事实上,Angular被配置为使用JS的相等比较。

您可以:

  1. 尝试添加track by子句:

    <select ... ng-options="org.name for org in orgs track by org.id">
    
  2. 如果ipCookie('selectedOrg')返回一个值,不要把它放在scope.selectedOrg;相反,在orgs列表中搜索该特定对象,并将该对象放在scope.selectedOrg中。