我是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时会调用它。选项卡的新值正在打印,但下拉列表未初始化。
答案 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读取它时。
这更有意义吗?