【问题标题】:How to call Angularjs directive after the return of another function?另一个函数返回后如何调用Angularjs指令?
【发布时间】:2016-06-27 07:27:05
【问题描述】:

我的网站上有一个类似于以下的代码:

<div ng-click=someFunction() my-directive>...</div>
<div ng-show=showMe>...</div>

someFunction() 函数如下所示:

function onSuccess() {
    // do something
    console.log("in response")
}
function someFunction() {
    $http( 
        {
         ...
         }).then(onSuccess);

}

指令my-directive的创建如下:

app.directive(myDirective, function() {
    return {
        restrict: 'A',
        link: function(scope, $elm) {
                $elm.on('click', function() {
                    console.log("in directive");
                    //do something
                });
        }
    }
});

问题是我需要指令仅在 onSuccess 完成加载后而不是之前触发(即,我想在控制台中看到“in 指令”之前的“响应”,现在我看到“in指令”第一)

看起来可行,但我找不到如何... 任何帮助/想法将不胜感激!

编辑: 我刚刚看到了这个答案:Wait for data in controller before link function is run in AngularJS directive 这不是我想要的,因为函数 someFunction 独立于指令,我希望它尽可能保持独立(该函数放置在应用程序的控制器中,我不想直接从那里操作视图)。

编辑 2: 我知道使用超时的可能性,但我宁愿使用更通用的解决方案。如果超时,我将不得不猜测要等待多长时间,我不想依赖它。

编辑 3: 我将函数 someFunction 编辑为更具体的函数。我无法更改 someFunction 的结构,也不想在 onSuccess 中执行指令的工作。

再次感谢!

【问题讨论】:

  • 这个SO answer 可能就是您要找的。请忽略此评论。
  • @alex_andrea 我会提出相同的建议,但我认为它不适用于同一对象上的属性指令和点击侦听器。您只能添加或删除带有ng-if 的元素,而不是元素的属性。
  • @ssc-hrep3 我从来没想过。感谢您指出。:)
  • 感谢您的 cmets,但正如@ssc-hrep3 指出的那样,上述答案在这里无济于事。谢谢:-)
  • 在您的场景中,您有链接到 DOM 元素单击事件的响应,因此我们不能使用 ng-if。所以去 $timeout 功能。

标签: javascript angularjs http angularjs-directive


【解决方案1】:

如果您将多个事件侦听器添加到同一个元素,它们将按照addEventListener() 调用的顺序执行。例如

e.addEventListener('click', function(){ console.log('Click 1'); });
e.addEventListener('click', function(){ console.log('Click 2'); });

将首先显示“单击 1”,然后显示“单击 2”。 Angular 似乎并非如此,因为您说指令首先触发。

如果你可以修改指令,我会等待 100 毫秒左右。

link: function(scope, $elm) {
    $elm.on('click', function() {
        $timeout(function(){
            console.log("in directive");
                //do something
            });
        }, 100);
    }

给控制器时间做它的事情。

【讨论】:

  • 嗨,超时可能会完成这项工作,但我正在寻找一个更通用的解决方案(正如你所写,事件监听器在这里不相关)。还是谢谢!
【解决方案2】:

我向您推荐,使用另一种方法。不要使用 ng-click 而是将你的函数传递给你的指令

app.directive(myDirective, function() {
   return {
       restrict: 'A',
       link: function(scope, $elm, iattrs) {
            $elm.on('click', function() {
                scope.$eval(iattrs.myDirective)
                .then(function(response) {
                   console.log("in directive");
                   //do something
                });
            });
       }
   }
});

请看这个插件:https://plnkr.co/edit/PaV6cCn0NmpBIVaJGAEL?p=preview

它假设函数返回一个承诺

【讨论】:

  • 嗨,谢谢。问题是函数 someFunction 调用了一个 http,我希望在其回调完成运行后调用该指令。
  • 我不明白。 $http 返回一个承诺,您可以返回它而不是我的承诺示例。您可以在 $http 发送响应后执行指令代码。当您说“在回调完成后调用指令”时,您希望在 ? 之后使用角度调用链接函数
  • 我根本做不到。我的代码工作方式不同,我无法返回承诺。
  • 好的,所以写你的完成 someFunction()
  • 编辑了问题。完整的实现是无关紧要的,因为我不想改变它的结构,因为其他元素都依赖于它
猜你喜欢
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多