Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.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
Angularjs 如何将$scope.$绑定到两个操作,但只执行一个函数?_Angularjs_Angularjs Directive_Angularjs Scope - Fatal编程技术网

Angularjs 如何将$scope.$绑定到两个操作,但只执行一个函数?

Angularjs 如何将$scope.$绑定到两个操作,但只执行一个函数?,angularjs,angularjs-directive,angularjs-scope,Angularjs,Angularjs Directive,Angularjs Scope,问题: 我有一个在两个地方使用的指令,但是做同样的事情(因此有一个指令) 问题在于,指令创建的两个对象之一需要响应多个广播消息(与单个消息相反)广播的两个消息(在链接函数中创建的)中的任何一个 重申: 对象1(如果!$scope.ismini) 需要响应消息“视频开关” 对象2(如果$scope.ismini) 需要响应消息“视频开关” 还需要响应消息“日历状态已更改” 只需执行一次操作(无论调用哪个操作) 返回{ 限制:“A”, 范围:{ 伊斯米尼:“=” }, 链接($scop

问题:

我有一个在两个地方使用的指令,但是做同样的事情(因此有一个指令)

问题在于,指令创建的两个对象之一需要响应多个广播消息(与单个消息相反)广播的两个消息(在链接函数中创建的)中的任何一个

重申:
  • 对象1(如果!$scope.ismini)

    • 需要响应消息“视频开关”
  • 对象2(如果$scope.ismini)

    • 需要响应消息“视频开关”
    • 还需要响应消息“日历状态已更改”
    • 只需执行一次操作(无论调用哪个操作)
返回{
限制:“A”,
范围:{
伊斯米尼:“=”
},
链接($scope,元素:JQuery,attrs,ctrl){
$scope.$on(“视频开关”,()=>{
setWordCloud(元素$scope.ismini);
});
if($scope.ismini){
$scope.$on(“日历状态已更改”,()=>{
setWordCloud(元素$scope.ismini);
});
}
}

}
创建一个具有逻辑的函数,并在两个位置使用它,而不是创建两个具有相同逻辑的匿名函数,并在调用该函数时解除该函数的抖动。 这意味着在函数上放置一个计时器,如果另一个函数试图在超时发生之前运行同一个函数,则重置计时器

return {
    link($scope, element: JQuery, attrs, ctrl) {
        var processChange = function()
            setWordCloud(element, $scope.ismini);
        };
        var timeoutId;
        $scope.$on("video-switch", function() {
            $timeout.cancel(timeoutId);
            timeoutId = $timeout(processChange, 10, true);
        });

        if ($scope.ismini) {
            $scope.$on("calendar-state-changed", function() {
            $timeout.cancel(timeoutId);
            timeoutId = $timeout(processChange, 10, true);
        })

    }
}

这样做的一个缺点是,将出现另一个$digest循环,这可能会导致屏幕闪烁,但如果两个函数都可以调用,并且您只想运行它们一次,则实际上没有其他选项。

但是问题仍然存在,如果$scope.isMini,它将被调用两次。一次用于“视频切换”,一次用于“日历状态更改”