Angularjs-添加/删除动态html元素(下拉列表)

msr*_*ekm 0 html javascript angularjs angularjs-directive

这是我的代码 - http://plnkr.co/edit/oTWXbLIKOxoGTd4U0goD?p=preview

  1. 为什么日子dropdown没有数据绑定scope.demoDays,它总是空的?

  2. 这是dropdown动态添加的正确方法吗?如果用户添加5个下拉列表,如何获得结果,将 ng-model="selectedDay"创建一个选择数组?有什么建议?

谢谢

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope, $compile) {

  var counter = 0;
  $scope.fields = [];

  $scope.days =['Day','Sun','Mon','Tue','Wed','Thu','Fri','Sat'];

    $scope.addField = function() {          
     $scope.fields.push({name:"test " + counter++});
    };
});



app.directive('demoDisplay', function($compile){
    return {
    scope:{
        demoDisplay:"=", //import referenced model to our directives scope
        demoDays:"="
      },
     link:function (scope, elem, attr, ctrl) 
      {
        scope.$watch('demoDisplay', function(){ // watch for when model changes

          elem.html("") //remove all elements

          angular.forEach(scope.demoDisplay, function(d){ //iterate list
              var s = scope.$new(); //create a new scope
              angular.extend(s,d); //copy data onto it
              console.log(scope.demoDays);

              var template = '<label class="item item-input"><div class="style-select"><select ng-model="selectedDay" ng-options="day for day in scope.demoDays"></select><br></div></label>';
              elem.append($compile(template)(s)); // compile template & append
          });
        }, true) //look deep into object
      }
    }
})
Run Code Online (Sandbox Code Playgroud)

HTML

<button ng-click="addField()">Add Field</button>

<div demo-display="fields" demo-days="days"></div>
Run Code Online (Sandbox Code Playgroud)

j.w*_*wer 9

$watch在链接函数中没有必要- 您已经通过=在scope属性上指定了已建立的双向绑定.并且您可以使用普通模板,而无需编译.

templateUrl: 'template.html',
Run Code Online (Sandbox Code Playgroud)

在哪里template.html:

<label class="item item-input">
  <div class="style-select">
    <select ng-model="demoDisplay.selection" ng-options="day for day in demoDays"></select>
    <br>
  </div>
</label>
Run Code Online (Sandbox Code Playgroud)

请注意,select将绑定到demoDisplay.selection,将在每个字段上创建,并可通过双向绑定在父作用域上访问.另外,请注意,在内部ng-options,我改为scope.demoDaysjust demoDays.在指令的模板中,您只需使用属性的名称来访问范围值.

ng-repeat单击按钮时,可以使用内部指令创建其他字段:

<div ng-repeat="field in data.fields">
  <div demo-display="field" demo-days="days"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

这是一个工作的插件:http://plnkr.co/edit/pOY0l18W7wEbfSU7DKw2?p =preview