Javascript 为什么我的指令会因为同一指令的另一个实例中的更改而更新?

Javascript 为什么我的指令会因为同一指令的另一个实例中的更改而更新?,javascript,html,angularjs,Javascript,Html,Angularjs,我围绕HTML文件输入创建了一个简单的指令包装器,以使角度绑定工作。这是我的指示: angular.module('myApp').directive('inputFile', InputFileDirective); function InputFileDirective() { var bindings = { selectLabel: '@', }; return { restrict: 'E', require: ['inputFile', 'ngM

我围绕HTML文件输入创建了一个简单的指令包装器,以使角度绑定工作。这是我的指示:

angular.module('myApp').directive('inputFile', InputFileDirective);

function InputFileDirective() {
  var bindings = {
    selectLabel: '@',
  };
  return {
    restrict: 'E',
    require: ['inputFile', 'ngModel'],
    scope: true,
    controllerAs: 'inputFileCtrl',
    bindToController: bindings,
    controller: function () {
    },
    template: `<input class="ng-hide" id="input-file-id" type="file" />
<label for="input-file-id" class="md-button md-raised md-primary">{{ inputFileCtrl.getButtonLabel() }}</label>`,
    link: link
  };

  function link(scope, element, attrs, controllers) {
    if (angular.isDefined(attrs.multiple)) {
      element.find('input').attr('multiple', 'multiple');
    }
    var inputFileCtrl = controllers[0];
    var ngModelCtrl = controllers[1];

    inputFileCtrl.getButtonLabel = function () {
      if (ngModelCtrl.$viewValue == undefined || ngModelCtrl.$viewValue.length == 0) {
        return inputFileCtrl.selectLabel;
      }
      else {
        return ngModelCtrl.$viewValue.length + (ngModelCtrl.$viewValue.length == 1 ? " file" : " files") + " selected";
      }
    };

    element.on('change', function (evt) {
      ngModelCtrl.$setViewValue(element.find('input')[0].files);
      ngModelCtrl.$render();
    });
  }
};
angular.module('myApp').directive('inputFile',InputFileDirective);
函数InputFileDirective(){
变量绑定={
选择标签:'@',
};
返回{
限制:'E',
要求:['inputFile','ngModel'],
范围:正确,
controllerAs:'inputFileCtrl',
bindToController:绑定,
控制器:函数(){
},
模板:`
{{inputFileCtrl.getButtonLabel()}}`,
链接:链接
};
功能链接(范围、元素、属性、控制器){
if(角度定义(属性倍数)){
元素find('input').attr('multiple','multiple');
}
var inputFileCtrl=控制器[0];
var ngModelCtrl=控制器[1];
inputFileCtrl.getButtonLabel=函数(){
如果(ngModelCtrl.$viewValue==undefined | | ngModelCtrl.$viewValue.length==0){
返回inputFileCtrl.selectLabel;
}
否则{
返回ngModelCtrl.$viewValue.length+(ngModelCtrl.$viewValue.length==1?“文件”:“文件”)+“选定”;
}
};
元素。on('change',function(evt){
ngModelCtrl.$setViewValue(element.find('input')[0]。文件);
ngModelCtrl.$render();
});
}
};
这是HTML

<body ng-app="myApp" ng-controller="MyController as ctrl">
  <form name="ctrl.myForm">
    <input-file select-label="Select Attachment" ng-model="ctrl.attachment1"></input-file>

    <input-file select-label="Select Attachment" ng-model="ctrl.attachment2"></input-file>
  </form>
</body>

这很简单,只要页面上有一个就行了。当我添加第二个时,我注意到只有第一个会更新。如果选择包含第二个文件的文件,则标签将在第一个文件上更新。我怀疑require['inputFile']正在将第一个指令实例的控制器拉入link函数或其他什么(不应该发生这种情况)。即使现在我输入这个,这对我来说也没有什么意义。那么这里发生了什么,我该怎么解决


这里有一个代码笔供你们玩,并试着找出答案:

你们的问题不在于你们的角度。。。是与你的html。 您正在为同一id分配两次。 将模板更改为:

template: `<label class="md-button md-raised md-primary">{{ inputFileCtrl.getButtonLabel() }}<input class="ng-hide" type="file" /></label>`
模板:`{{inputFileCtrl.getButtonLabel()}`

这是使用
controllerAs
语法进行绑定的方式
scope:true
启用隔离作用域,您的绑定可以绑定到
bindToController
属性。我用叉子叉了支笔,用另一种方式:我仍然有这个问题。另外,我没有使用
angular.element
,而是使用
link
函数传递的
element
(它是
标记)。我应该像Claies指出的那样纠正自己,并声明
scope:true
创建了一个“原型继承其父范围”的范围,如下所述:你是对的!我确实有身份冲突。这解决了我的问题!你是马纳达税!