AngularJS 如何在自定义指令标签内使用 ng-model,动态设置控制器?
AngularJS how to use ng-model inside a custom directive tag, setting the controller dynamically?
我刚入职Angular最近,所以有一些问题。
我的问题:
例如,我创建了一个指令,我将在许多情况下使用不同的控制器 'pages'。
现在我可以很好地动态设置控制器,这个问题就解决了!
但是,在每个指令实例中,我想定义控制器中要更改的变量是什么,例如 ng-model
。如果我直接放在模板中的标签内,它就可以工作,但我需要动态地使用它。
指令:
app.directive('mySelectPicker', function () {
var ddo = {};
ddo.restrict = 'E';
ddo.templateUrl = 'js/directives/views/my-select-picker.html';
ddo.scope = {};
ddo.controller = "@";
ddo.name = "controllerName";
return ddo;
});
我的-SELECT-PICKER.HTML:
OBS1:(ng-repeat 与时间控制器数组中的值完美配合)
OBS2:如果我将 ng-model
放在 select 标签中,它会起作用,但会是静态的!
<select>
<option value="{{time.value}}" ng-repeat="time in times" >{{time.text}}</option>
</select>
控制器:
app.controller('MyController', function($scope, moment){
$scope.times = []; //array with the options
$scope.val1 = '';
$scope.val2 = '';
});
使用指令:
<my-select-picker controller-name="MyController" **ng-model="val1"**></my-select-picker>
<my-select-picker controller-name="MyController" **ng-model="val2"**></my-select-picker>
在简历中,我需要在每个<my-select-picker>
中定义ng-model
来定义控制器中的变量是什么。怎么可能?
您已经为您的指令创建了独立的作用域,因此您无法访问放置了指令标记的控制器指令的父作用域,因此您需要将选项列表和模型名称传递给您的指令。
不要使用 ng-model
作为属性,因为在指令元素上使用 ng-model
属性没有任何意义,因为它不是输入元素。相反,您可以将该属性命名为 model
& list
,然后在 isolated of 指令中定义 model
& list
属性。这两个 属性 都将使用 =
以便它可以轻松地执行双向绑定。您也可以使用 ng-options
而不是 ng-repeat
选项渲染,因为 ng-options
可以将对象绑定到 ng-model
on selection.
HTML
<my-select-picker list="times" controller-name="MyController" model="val1"></my-select-picker>
<my-select-picker list="times" controller-name="MyController" model="val2"></my-select-picker>
指令
ddo.scope = {
model: '=',
list: '='
};
我的-select-picker.html
<select ng-model="model" ng-options="l.value as l.text for l in list"></select>
我刚入职Angular最近,所以有一些问题。
我的问题:
例如,我创建了一个指令,我将在许多情况下使用不同的控制器 'pages'。
现在我可以很好地动态设置控制器,这个问题就解决了!
但是,在每个指令实例中,我想定义控制器中要更改的变量是什么,例如 ng-model
。如果我直接放在模板中的标签内,它就可以工作,但我需要动态地使用它。
指令:
app.directive('mySelectPicker', function () {
var ddo = {};
ddo.restrict = 'E';
ddo.templateUrl = 'js/directives/views/my-select-picker.html';
ddo.scope = {};
ddo.controller = "@";
ddo.name = "controllerName";
return ddo;
});
我的-SELECT-PICKER.HTML:
OBS1:(ng-repeat 与时间控制器数组中的值完美配合)
OBS2:如果我将 ng-model
放在 select 标签中,它会起作用,但会是静态的!
<select>
<option value="{{time.value}}" ng-repeat="time in times" >{{time.text}}</option>
</select>
控制器:
app.controller('MyController', function($scope, moment){
$scope.times = []; //array with the options
$scope.val1 = '';
$scope.val2 = '';
});
使用指令:
<my-select-picker controller-name="MyController" **ng-model="val1"**></my-select-picker>
<my-select-picker controller-name="MyController" **ng-model="val2"**></my-select-picker>
在简历中,我需要在每个<my-select-picker>
中定义ng-model
来定义控制器中的变量是什么。怎么可能?
您已经为您的指令创建了独立的作用域,因此您无法访问放置了指令标记的控制器指令的父作用域,因此您需要将选项列表和模型名称传递给您的指令。
不要使用 ng-model
作为属性,因为在指令元素上使用 ng-model
属性没有任何意义,因为它不是输入元素。相反,您可以将该属性命名为 model
& list
,然后在 isolated of 指令中定义 model
& list
属性。这两个 属性 都将使用 =
以便它可以轻松地执行双向绑定。您也可以使用 ng-options
而不是 ng-repeat
选项渲染,因为 ng-options
可以将对象绑定到 ng-model
on selection.
HTML
<my-select-picker list="times" controller-name="MyController" model="val1"></my-select-picker>
<my-select-picker list="times" controller-name="MyController" model="val2"></my-select-picker>
指令
ddo.scope = {
model: '=',
list: '='
};
我的-select-picker.html
<select ng-model="model" ng-options="l.value as l.text for l in list"></select>