注册后(即从控制台)如何执行 Angular 控制器的构造函数?

Posted

技术标签:

【中文标题】注册后(即从控制台)如何执行 Angular 控制器的构造函数?【英文标题】:How to execute the constructor of an Angular controller after registration (i.e. from console)? 【发布时间】:2017-06-19 23:58:33 【问题描述】:

在这里尝试了一整天后,我...

Angularjs 新手,虽然 js 知识不错,但我相信对于你们中的一些人来说,这个问题应该是不费脑子的。

假设我们有以下 Angular 迷你应用:

<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<body ng-app="myApp">
    <div ng-controller="ctrl">
        <h1 ng-click="toggle()">firstname</h1>
    </div>
    <script>
        var app = angular.module('myApp', []);
        app.controller('ctrl', function($scope) 
            $scope.firstname = "adam";
            $scope.toggle = function() 
                $scope.firstname = "eva";
            
        );
    </script>
</body>
</html>

之后我可以注册更多控制器(即从控制台),如下所示:

// ought to overwrite the behaviour of the old one
app.controller('ctrl', function($scope) 
    $scope.firstname = "adam";
    $scope.toggle = function() 
        $scope.firstname= $scope.firstname == 'adam' ? 'eva' : 'adam';
    
);

我到底如何以编程方式调用后一个控制器的构造函数以获得切换功能的新行为(最好从控制台)???

编辑

访问控制器的作用域并将toogle 分配给新函数并没有真正帮助,以防函数引用在构造函数内部但在函数体外部声明的变量。

【问题讨论】:

这看起来很相似,检查你的 dom 然后你应该能够使用选择器并运行切换功能***.com/questions/22795628/… 感谢您的提示。但我不是指控制器的范围访问。我想知道如何执行构造函数以便将$scope.toggle 分配给新函数。顺便说一句,我之前看过那个帖子。 我在玩这个:angular.element(document.querySelector('.my-class')).scope().toggle = function () alert('ok'); 其中my-class 将是你的&lt;h1&gt; 标签的一个类,这会覆盖切换功能,但我不知道你是不是这样寻找 请检查我的编辑。我的目标实际上是执行 snd 控制器的构造函数 【参考方案1】:

你可以这样做将控制器的构造函数分配给一个变量:

var ctrl = function($scope, t) 
    $scope.firstname = "adam";
    $scope.toggle = function() 
        $scope.firstname= $scope.firstname == 'adam' ? 'eva' : 'adam';    
    
    console.log("Controller was Instantiated!!!");
;

然后使用注入器将其实例化,如下所示:

var injector = angular.element($0).injector();
injector.instantiate(ctrl,  
    $scope: injector.get("$rootScope"),
    t: injector.get("t")
);

(假设服务t已经注册。)

【讨论】:

angular.element($0).inject() VM68:1 Uncaught TypeError: angular.element(...).inject is not a function at :1:21 改用angular.element($0).injector() 对不起,我的错...但是我仍然不知道如何注入从具有依赖关系的构造函数的执行环境中获利的方法。想想类似的东西:app.controller('ctrl', ['$scope','d', function($scope,d) $scope.toggle = function () d.doSomething(); ]) 您必须使用注入器的get() 方法自己手动注入这些。我已经更新了我的答案作为示例。 就是这样!谢谢。不幸的是,我不能给你超过一票...

以上是关于注册后(即从控制台)如何执行 Angular 控制器的构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

在角度控制器中注册引导事件处理程序

如何在页面加载时执行 AngularJS 控制器功能?

如何从 Angular 2 响应中获取所有标头?

Angular 初始化项目后,如何把默认的 .css 文件修改为 .scss 文件?

在Angular Js中重新加载后,如何将复选框(选中或未选中)从javascript控制器更新到html页面?

关闭模态视图控制器,然后执行 segue