多个指令共享相同的范围

Multiple directives sharing same scope

我开发了一个指令,但它总是在页面的最后一个元素上应用功能,这是我的代码:

HTML:

<div ng-controller="MyCtrl">
  <input type="text" email-commy comma-separated-data="model1" class="form-control"/>
  <input type="text" email-commy comma-separated-data="model2" class="form-control"/>
</div>

JS:

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

function MyCtrl($scope) {
    $scope.model1 = "abc@gmail.com";
    $scope.model2 = "abc2@gmail.com";
}

app.directive("emailCommy", function(){
  return {
    scope: {
      commaSeparatedData: '='
    },    
    restrict: "A",  
    multiple: true,
    link: function (scope, elem, attrs, ngModel) {

      function handler(dataString){

        function buildEmailList() {

          var lis = data.map(function (em, index) {
            return "<li>" + em + "<span class='remove-element' data-index='" + index + "'>&times;</span>" + "</li>";
          }).join("");

          var input = $("<input/>", {"class": "form-control shadow-element", "placeholder": "Enter..."});
          lis += "<li class='input-field'>" + input.wrap("<p/>").parent().html() + "</li>";

          return "<ul class='list-inline'>" + lis + "</ul>";
        }

        function renderer() {
          $wrapper.empty().append(buildEmailList());          
          elem.addClass("hide").before($wrapper);
          listener();
        }

        function listener() {
          angular.element(".shadow-element").off("keypress").on("keypress", function (evt) {
            var $this = $(this),
                charCode = evt.which || evt.keyCode;

            //add input in case of (comma, enter, and semi-colon) pressed
            if ($this.val() && (charCode === 44 || charCode === 13 || charCode === 59)) {
              data.push($this.val().toLowerCase());                                    
              renderer();

              updateModel();
              $this.val("");
            }
          });

          angular.element(".remove-element").off("click").on("click", function () {
            var $this = $(this),
                index = $this.data("index");

            data.splice(index, 1);
            updateModel();
            renderer();
          });
        }

        function updateModel(){
          var updatedVal = data.join(",");
          $(elem).val(updatedVal);
        }

        if(dataString) {
          var data = dataString.split(",").map(function (em) {
            return em.toLowerCase().trim();
          });

          var $wrapper = $("<div/>", {"class": "email-container"});

          renderer();
        }
      }

      handler(scope.commaSeparatedData);

      //scope.$watch(attrs.commaSeparatedData, handler);
    }
  };
});

这里是fiddle: http://jsfiddle.net/RmDuw/928/

指令仅适用于最后一个元素。如果我在第一个指令中添加数据,它会添加到下面的指令中。

请帮忙,并建议我如何修复。 谢谢

只需更改您的代码,以便 select 像这样输入当前指令:

function listener() {
   $wrapper.find('input').on(...

并删除元素:

$wrapper.find('span')..

查看 fiddle