Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs ng模型未与控制器绑定';在使用指令动态创建表单时使用s$scope。_Angularjs_Angularjs Directive_Angularjs Scope - Fatal编程技术网

Angularjs ng模型未与控制器绑定';在使用指令动态创建表单时使用s$scope。

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

视图代码:-mydir是我的自定义指令

<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站点当前已关闭:(,我稍后会查看。