有没有办法在 AngularJS 之外重新定义绑定到 $ctrl 的函数?

Posted

技术标签:

【中文标题】有没有办法在 AngularJS 之外重新定义绑定到 $ctrl 的函数?【英文标题】:Is there a way to re-define a function bound to $ctrl outside of AngularJS? 【发布时间】:2020-05-01 09:05:34 【问题描述】:

在我的 DOM 中,我有一个包含 ng-click="$ctrl.goToHome() 的元素,它绑定到我网站的徽标。该元素是由使用 AngularJS 制作的第三方应用程序创建的。请参阅下面的完整元素:

<img ng-if="::!$ctrl.config.url" ng-click="$ctrl.goToHome()" class="ct-logo" ng-src="https://www.example.com/wp-content/themes/mytheme/logo.png"  src="https://www.example.com/wp-content/themes/mytheme/logo.png">

但是,此功能无法正常工作可能是因为未定义该功能。我不确定在哪里定义它。有没有办法重新定义 goToHome() 函数?换句话说,是否可以使用 jQuery 或 JS 重新绑定函数?如果是这样,最简单的方法是什么?

【问题讨论】:

【参考方案1】:

所以基本上,$ctrl 是它自己的作用域,有点像它自己的世界,其中定义的每个方法都不存在于外部,看起来你正在尝试在$ctrl 作用域之外使用$ctrl.goToHome() .

如果您希望goToHome() 方法在$ctrl 范围之外可用。

你可以做两个中的任何一个

您可以将goToHome() 方法提取到一个工厂,然后在您想使用它的任何范围内调用它。这样goToHome() 总是做一件事。
const app = angular.module("app", []);

const goToHomeHandler = function() 
    return 
        goToHome: function() 
            alert('go Home');
        
    ;
;

app.factory('goToHomeHandler', goToHomeHandler);

app.controller("personController", function($scope, goToHomeHandler) 
    $scope.firstName = "John";
    $scope.lastName = "Doe";
    $scope.goToHome = function () 
        goToHomeHandler.goToHome();
    
);

app.controller("personController2", function($scope, goToHomeHandler) 
    $scope.firstName = "Second John";
    $scope.lastName = "Second Doe";
    $scope.goToHome = function () 
        goToHomeHandler.goToHome();
    
);
另一种可能不是最好的选择是在 $windows 范围内定义 goToHome() 方法,这样它就可以在任何地方访问。

我在下面添加了一个小例子

如您所见,即使test() 方法是在personController 中创建的,但只要通过$windows 范围访问它,它就可以在personController2 中使用

    const app = angular.module("app", []);
    app.controller("personController", function($scope, $window) 
    $window.goToHome = function() 
      alert('yoyo');
    
    $scope.firstName = "John";
    $scope.lastName = "Doe";
    $scope.goToHome = function () 
        $window.goToHome();
    
);

app.controller("personController2", function($scope, $window) 
    $scope.firstName = "Second John";
    $scope.lastName = "Second Doe";
    $scope.goToHome = function () 
        $window.goToHome();
    
);

【讨论】:

感谢您的回答。正如我所提到的,我自己并没有应用 Angular,它来自第三方应用程序模块。所以基本上,我应该安装 AngularJS 并尝试重新定义它?我应该使用哪个版本的 AngularJS? 如果你的代码中有ng-click,那么你的代码库中已经有AngularJS了。如果你不能弄清楚,你可以创建一个新的 JS 方法,它与$ctrl.goToHome() 具有相同的功能

以上是关于有没有办法在 AngularJS 之外重新定义绑定到 $ctrl 的函数?的主要内容,如果未能解决你的问题,请参考以下文章

angularjs 难点总结

angularjs组件绑定参数检查

如何在angularjs执行多个异步操作后再执行指定操作

AngularJS 自定义指令两种方式绑定

AngularJS 中有没有办法用其他常量定义常量?

搜索引擎如何处理AngularJS应用程序?