在使用ng后附加一个处理程序

我已经看过这个问题,它说:

何时有利于ng-if与ng-show / ng-hide?

“例如,如果您将点击处理程序绑定到其中一个子元素,那么当ng-if的计算结果为true时,该元素将从DOM中移除,并且即使在ng之后,您的点击处理程序也不再起作用,如果稍后计算结果为true并显示该元素,您需要重新附加处理程序。“

重新附加处理程序意味着什么? 对于这里的这个例子,绑定到ng-click的函数实际上工作,即使我删除并添加元素。

<tr ng-if="!useUserLoginTemplate" class="showRowAnimation">

          <td>Template</td>
          <td>
              <input type="file" file-model="loginTemplateFile">  
              <span class="btn btn-primary" ng-click="uploadLoginTemplateFile()">Upload</span> 
          </td>

</tr>

我无法使用$ scope.loginTemplateFile访问文件,就像我使用不带ng的版本一样 - 如果可以的话。

文件模型指令链接功能:

link: function(scope, element, attrs) {
        var model = $parse(attrs.fileModel);
        var modelSetter = model.assign;

        element.bind('change', function(){
            scope.$apply(function(){
                modelSetter(scope, element[0].files[0]);
            });
        });
 }

这里发生了什么?


在理论上(并非总是如此,但一般而言),'重新连接处理程序'适用于在命令式代码中生成的处理程序,埋在控制器或其他指令或某事中的某处。 使用像ng-click这样的好声明性指令不应该成为问题,因为无论何时呈现模板,这些处理程序都将由Angular重新附加。 在我后来对你所引用的SO帖子的回答中,我谈到了像这样的命令处理程序通常是一个坏主意,除非它们有条件保留在视图之间存在的一些模型数据。

关于为什么你不能访问$scope.loginTemplateFile的更具体的问题,这将有助于让小提琴进行调试。 一个问题:为什么不使用ng-model来声明你的模型绑定并保持清洁? 您可以通过使用require:属性来注入ng-model信息,然后再声明性地访问ng-model信息,如本文所述。 (我最初的怀疑是你正在使用的表单导致loginTemplateFile属性以某种方式被写入多个作用域,特别是如果我们看到的模板正在基于ng-repeat或其他东西呈现到DOM中)。


您无法使用$scope.loginTemplateFile访问文件,因为您的指令名称本身是file-model并且您正在将link函数中的指令名称作为属性进行调用。

要访问父范围数据,并且当您将指令限制为“属性”类型时,请参阅下面更新的代码片段。

<input type="file" file-model attrName="loginTemplateFile">  

其中file-model是您的指令, attrName是指令的链接函数可以引用的属性名称。 我正在修改link函数以使用更新的属性名称

link: function(scope, element, attrs) {
        var model = $parse(attrs.attrName);
        var modelSetter = model.assign;

        element.bind('change', function(){
            scope.$apply(function(){
                modelSetter(scope, element[0].files[0]);
            });
        });
 }

请参阅有关如何创建指令的角度文档。

链接地址: http://www.djcxy.com/p/78589.html

上一篇: attach a handler after using ng

下一篇: In Reagent of Clojurescript, how do I add event listeners for drag and drop?