AngularJS - 指令组件下拉列表未初始化以进行编辑

时间:2013-10-22 17:59:58

标签: angularjs angularjs-directive

我是Angular JS的新手。 我想要做的是使用Directive创建一个可重用的组件。截至目前,它只有一个下拉列表。在执行添加下拉时,将使用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'}];

如您所见,我已添加“标签”进行测试。我正在更改加载函数上的tab值,当我单击Edit时会调用它。选项卡的新值正在打印,但下拉列表未初始化。

1 个答案:

答案 0 :(得分:0)

您尝试使用以下方式从控制器双向绑定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: '='},也可以将$scope.permissionValues函数中的controller更改为$scope.array。要么应该工作。

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

这更有意义吗?