Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.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
Javascript 更改“单击”功能属性。在Angular.js中_Javascript_Angularjs - Fatal编程技术网

Javascript 更改“单击”功能属性。在Angular.js中

Javascript 更改“单击”功能属性。在Angular.js中,javascript,angularjs,Javascript,Angularjs,我在一个名为old()的指令中定义了一个函数,当前按钮在单击时执行此函数。我想在加载指令时,将旧的()函数更改为新的()函数。新函数将通过参数(this.form)接收(“form”是我表单的名称)。 我已经试过了,但是它 attrs.$set('ngClick', 'new(this.form)'); 但是new()函数没有执行。我怎么做?。 我需要在指令中这样做,也许它可以在控制器中实现,但我需要在指令中这样做,我把这个例子应用到我的实际项目中。多谢各位 我不知道你为什么要这么做。实现一

我在一个名为old()的指令中定义了一个函数,当前按钮在单击时执行此函数。我想在加载指令时,将旧的()函数更改为新的()函数。新函数将通过参数(this.form)接收(“form”是我表单的名称)。 我已经试过了,但是它

attrs.$set('ngClick', 'new(this.form)');
但是new()函数没有执行。我怎么做?。 我需要在指令中这样做,也许它可以在控制器中实现,但我需要在指令中这样做,我把这个例子应用到我的实际项目中。多谢各位


我不知道你为什么要这么做。实现一个函数,该函数将使用您需要实现的两个函数的两个用例。例如,如果您希望在启动期间使用某个x函数,然后触发functionx,然后在某个操作发生时触发functiony,该函数在函数old()中调用

我绝对不建议更改属性。但是,如果你真的不想这样做,这就是你可能想要的方式

app.directive('validation', function ($timeout) {

            return {
                restrict: 'AE',
                require: 'ngModel', 

                link: function (scope, element, attrs, ngModel) {
                  if (!ngModel){
                    return;          
                  }

                  scope.previous= function(){
                    alert("old")
                  }

                 scope.old= scope.previous 

                  scope.new= function(form){
                    alert("new");
                    console.log(form)
                  }
                 // Do this action may be within a function after an action 
                 // or an event $emit/$broadcast rather than directly in code.
                 attrs.$set('ngClick', scope.old = scope.new); 
               }

            };
        });
请也看看这个stackoverflow。

新函数无法运行的原因是,当链接函数中的代码运行时,AngularJS已经完成了模板的编译,并将所有找到的指令(ng click)与指令范围链接起来

将ng click值更改为新函数后,需要重新编译指令以使更改生效

您可以查看angularjs$compile服务,了解如何使用它:$compile

但是,我不认为这是解决问题的最佳方法,因为Javascript具有一些函数编程功能,允许您将函数作为参数传递,您可以将旧函数新函数合并到单个函数中,并通过参数控制要调用的函数,以下是一个例子:

link: function (scope, element, attrs, ngModel) {
    if (!ngModel){
      return;          
   }

   scope.old = function(){
       alert("old");
   }

   scope.new = function(form){
       alert("new");
      console.log(form)
   }

   scope.current = scope.old; // variable to control with function being called
   scope.form = ''; // variable to contain the parameter for the function called via ng-click

   scope.binding_to_button = function(function_to_call, parameter) {
       function_to_call(parameter);
   }
                 // Do this action may be within a function after an action 
                 // or an event $emit/$broadcast rather than directly in code.
   scope.current = scope.new;
   scope.form = form; // 
               }
然后,不要绑定范围。新建范围。旧的直接绑定到ng。单击绑定范围。绑定到按钮

ng-click="binding_to_button(current, form)" 

此函数将以$scope.current作为第一个参数,以$scope.form作为第二个参数,因此您可以动态控制要调用的函数以及通过单击事件传递给它们的参数。

谢谢!。但是如何在模板(new(this.form))中获得this.form呢?我这样做,attrs.$set('ngClick',scope.old=scope.new(this.form));但为什么在启动应用程序时它会运行?当我点击按钮时,我需要这样做。我真的很感谢你的努力。但我会再解释一点。在模板中,用户应该输入ng click:ng click='old(this.form);表单。$valid&&new()。我不想让你排这么长的队。这就是为什么我想在指令中添加这一行,这样最终用户只需输入ng click='new()'。指令将构造ng click=“old(this.form);form.$valid&&new()”将实现更改为
ng click=“old(form)”
对于上一个函数,它将是未定义的,对于新函数,将获取值。您不必做任何事情,只需传递表单项即可。第一个是未定义的,第二个是捕获的。我非常感谢你的努力。但我会再解释一点。在模板中,用户应该输入ng click:ng click='old(this.form);表单。$valid&&new()。我不想让你排这么长的队。这就是为什么我想在指令中添加这一行,这样最终用户只需输入ng click='new()'。指令将构造ng click=“old(this.form);form.$valid&&new()”Hi yavg,如果您甚至不需要闭包,为什么不检查click处理程序中的条件并相应地调用new或old函数呢?
ng-click="binding_to_button(current, form)"