【问题标题】:AngularJS - directive components dropdown not getting initialized for editAngularJS - 指令组件下拉列表未初始化以进行编辑
【发布时间】:2013-10-22 17:59:57
【问题描述】:

我是 Angular JS 的新手。 我想做的是使用 Directive 创建一个可重用的组件。到目前为止,它只有一个下拉菜单。在执行 Add 时,下拉列表将填充 permissionValues 数组中的值,并与具有所选值的空模型绑定。但是,当我尝试编辑下拉菜单时,并没有使用现有模型值进行初始化。 指令代码。

  directive('userPermissions', function() {
      return {
        restrict: 'E',
        template:'<div><select ng-model="ngModel" ng-options="abc [optValue] as abc [optDescription] for abc in array"></select>{{tab}}</div>',
        replace: true,
        transclude: true,
        scope:{ ngModel: '=', tab:'='},
        link: function (scope, element, attrs) {
            scope.optValue = attrs.optValue;
            scope.optDescription = attrs.optDescription;
            scope.$watch(attrs.array, function(newVal, oldVal){
                 if(newVal != oldVal){
                     scope.array = newVal;
                 }
            });
        }
      };
    });

HTML 代码

                <user-permissions  tab="tab"  
                    ng-model="newUser.canCheckout1" 
                    array="permissionValues" 
                    opt-value="value" 
                    opt-description="label"></user-permissions>  

在主控制器中

 $scope.permissionValues = [{label:'Standard', value:'true'},{label:'Restricted', value:'false'}];

如您所见,我添加了“标签”进行测试。我正在更改加载函数选项卡的值,当我单击编辑时会调用该函数。正在打印选项卡的新值,但下拉菜单未初始化。

【问题讨论】:

    标签: angularjs angularjs-directive


    【解决方案1】:

    您正在尝试使用以下方式从控制器双向绑定 array 属性:

    scope: {array: '=' ... }
    

    问题是您的控制器中没有任何$scope.array。所以你需要以某种方式将两者联系起来。试试这个:

    link: function(scope, element, attrs){
        scope.optValue = attrs.optValue;
        scope.optDescription = attrs.optDescription;
        scope.array = scope.$eval(attrs.array);
    }
    

    这会起作用,但不会创建动态绑定。它只会读取一次值,然后如果scope[attrs.array] 发生变化,它将不会被更新。为此,您必须使用$watch 来监听更改:

    scope.$watch(attrs.array, function(newVal, oldVal){
         if(newVal != oldVal){
             scope.array = newVal;
         }
    });
    

    希望对您有所帮助。

    更新:

    为了澄清,有多种方法可以做到这一点,因此您可以自行决定如何做到这一点。但是指令中scope: { ... } 绑定背后的想法是,您指定要绑定范围的哪些属性以及如何绑定它们(单向或双向)。您告诉 Angular 将控制器中的 $scope.array 属性绑定到您的指令中。但是因为没有任何$scope.array 属性,所以没有任何东西被绑定。因此,您可以将绑定更改为scope: {permissionValues: '='},也可以将controller 函数中的$scope.permissionValues 更改为$scope.array。两者都应该工作。

    但是由于您尝试在指令中使用 array="permissionValues" 属性来表示要使用哪个 $scope 属性,所以我想您会希望按照我上面指定的方式进行操作。使用scope.$watch 意味着您根本不必使用任何scope: { ... } 绑定。 $watch 函数为您手动创建该绑定,并允许您使用 attrs.array 值在运行时动态绑定到正确的范围参数。使用scope: {} 要求您知道在创建指令时调用的范围属性,而不是在从 DOM 读取时调用的属性。

    这样更有意义吗?

    【讨论】:

    • 您好 Tennisgent,感谢您的回复。你是对的,我的控制器中没有 $scope.array。我应该同时添加 scope.array 和 watch 吗?我尝试单独添加每个,但它不起作用。如果我在 attrs.array 上添加手表,我应该在编辑时修改数组以便手表执行对吗?单击编辑我现在正在做什么我正在初始化主控制器中 cancheckout1 的模型值。我不确定如何从主控制器初始化数组。随意提出任何其他创建可重用下拉菜单的方法。
    • 添加了更多解释。让我知道这是否有帮助。
    • 我理解了这个概念,但不知何故它仍然不起作用。如果我理解正确,我不需要范围内的数组:{}。我已经编辑了问题部分的代码,但是在进行此更改后,下拉列表中没有填充任何内容,我得到的是一个空白下拉列表。但是如果我在 scope:{} 中添加数组变量,它至少会列出两个选项,但不会根据模型值预先选择任何东西。我是 Angular 新手,所以如果我的问题听起来很愚蠢,请原谅我。
    猜你喜欢
    • 2015-11-27
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多