Angularjs ng模型未与控制器绑定';在使用指令动态创建表单时使用s$scope。
视图代码:-mydir是我的自定义指令Angularjs ng模型未与控制器绑定';在使用指令动态创建表单时使用s$scope。,angularjs,angularjs-directive,angularjs-scope,Angularjs,Angularjs Directive,Angularjs Scope,视图代码:-mydir是我的自定义指令 <div ng-model="vdmodel" mydir="dataValue"> </div> 我的指示: app.directive('mydir',['$translate',function($translate){ return { restrict: 'A', transclude: tr
<div ng-model="vdmodel" mydir="dataValue">
</div>
我的指示:
app.directive('mydir',['$translate',function($translate){
return {
restrict: 'A',
transclude: true,
scope: {dir:'=mydir'},
compile: function(element, attrs) {
return function(scope, element, attrs, controller){
var setTemplate = '';
var setOpt = '';
if(scope.dir.itemtype== 'NUMBER'){
setTemplate = '<input type="number" class="form-control form-font ng-animate ng-dirty"';
setTemplate +='" ng-model="dir[somevalue]" value="'+scope.sizing.somevalue+'" >';
element.html(setTemplate);
}
}
}
}
});
app.directive('mydir',['$translate',function($translate){
返回{
限制:“A”,
是的,
作用域:{dir:'=mydir'},
编译:函数(元素、属性){
返回函数(范围、元素、属性、控制器){
var setTemplate='';
var setOpt='';
if(scope.dir.itemtype=='NUMBER'){
setTemplate='您需要做一些更改
1.当您使用隔离作用域时,也将ngModel传递给指令
<div ng-model="vdmodel" mydir="dataValue">
</div>
scope:{dir:'=mydir',ngModel:'='},
2.根据最佳实践,ngModel必须始终有一个点
ng model=“params.vdmodel”
3.确保在控制器中初始化params对象
$scope.params={}
通常,指令与父控制器共享相同的作用域,但由于您在指令中定义了一个作用域,它设置了自己的隔离作用域。现在,由于控制器和指令具有各自的作用域,您需要一种在它们之间共享数据的方法,现在可以使用数据来完成:范围中的“=”
应用程序代码
var myApp = angular.module('myApp', []);
myApp.controller('myController', function ($scope, $http) {
$scope.vdmodel = {};
})
.directive("mydir", function () {
return {
restrict: "A",
scope:{
data:"=model",
dir:'=mydir'
},
templateUrl: 'test/form.html'
};
});
form.html
<form>
Name : <input type="text" ng-model="data.modelName" /><br><br>
Age : <input type="number" ng-model="data.modelAge" /><br><br>
Place : <input type="text" ng-model="data.modelPlace" /><br><br>
Gender:
<input type="radio" ng-model="data.modelGender" value="male"/>Male<br>
<input type="radio" ng-model="data.modelGender" value="female"/>Female<br><br><br>
</form>
名称:
年龄:
地点:
性别:
男性
女性
页面名为page.html
<div ng-app="myApp" >
<div ng-controller="myController" >
<div model="vdmodel" mydir="dataValue"></div>
<h3>Display:</h3>
<div>
<div>Name : {{myData.modelName}} </div><br>
<div>Age : {{myData.modelAge}}</div><br>
<div>Place : {{myData.modelPlace}}</div><br>
<div>Gender : {{myData.modelGender}}</div><br>
</div>
</div>
</div>
显示:
名称:{{myData.modelName}}
年龄:{{myData.modelAge}}
地点:{{myData.modelPlace}}
性别:{{myData.modelGender}}
您必须使用$compile
服务来编译模板,并在将其放入元素之前链接到当前作用域
.directive('mydir', function($compile) {
return {
restrict: 'A',
transclude: true,
scope: {
dir: '=mydir'
},
link: function(scope, element, attrs, controller) {
var setTemplate = '';
var setOpt = '';
if (scope.dir.itemtype == 'NUMBER') {
setTemplate = '<input type="number" class="form-control form-font ng-animate ng-dirty"';
setTemplate += '" ng-model="dir.somevalue" value="' + scope.dir.somevalue + '" >';
element.html($compile(setTemplate)(scope));
}
}
}
});
指令('mydir',函数($compile){
返回{
限制:“A”,
是的,
范围:{
目录:'=mydir'
},
链接:功能(范围、元素、属性、控制器){
var setTemplate='';
var setOpt='';
if(scope.dir.itemtype=='NUMBER'){
setTemplate='这对我不起作用,你能给我指出一些好的例子吗?来自@TheRodeo的答案非常详细…还可以看一看egghead.io视频..angularjs初学者必须注意的是,你到底要实现什么?从模型动态构建表单?我在我的控制器中获得json数据,其中包含长数组并告诉应该基于“type”创建什么类型的dom元素,我将此信息发送到“mydir”"指令和动态创建元素,但当我提交表单时,我无法在我的控制器中收集表单数据。vdmodel
?在指令中,您将输入绑定到dir。somevalue
和dir
绑定到控制器中的dataValue
,因此输入最终将绑定到dataVvalue.somevalue
。我看不到vdmodel
在任何地方使用。即使我删除了vdmodel,这也不起作用。这对简单数据很有效,但我有嵌套对象和“dataValue”是对象中的数组值之一,是否有一种方法可以将其发送到控制器而无需在控制器中声明。然后,请更新您的问题,以包含您试图实现的目标的全部细节。嵌套对象看起来像什么?您想将什么信息发送到控制器?Tarm您可以帮助我设置selec吗这里的ted值是Plunker:-Plunker站点当前已关闭:(,我稍后会查看。