当前位置: 首页 > 面试题库 >

来自其他控制器的指令控制器中的调用方法

祁远
2023-03-14
问题内容

我有一个具有自己的控制器的指令。请参见以下代码:

var popdown = angular.module('xModules',[]);

popdown.directive('popdown', function () {
    var PopdownController = function ($scope) {
        this.scope = $scope;
    }

    PopdownController.prototype = {
        show:function (message, type) {
            this.scope.message = message;
            this.scope.type = type;
        },

        hide:function () {
            this.scope.message = '';
            this.scope.type = '';
        }
    }

    var linkFn = function (scope, lElement, attrs, controller) {

    };

    return {
        controller: PopdownController,
        link: linkFn,
        replace: true,
        templateUrl: './partials/modules/popdown.html'
    }

});

这旨在成为错误/通知/警告的通知系统。我想做的是从另一个控制器(不是指令控制器)调用show此控制器上的函数。当我这样做时,我还希望我的链接函数检测到某些属性已更改并执行了一些动画。

这是一些代码来举例说明我要的内容:

var app = angular.module('app', ['RestService']);

app.controller('IndexController', function($scope, RestService) {
    var result = RestService.query();

    if(result.error) {
        popdown.notify(error.message, 'error');
    }
});

所以打电话时show开启popdown指令控制器,链接功能也应该被触发,执行动画。我该如何实现?


问题答案:

这是一个有趣的问题,我开始考虑如何实现这样的功能。

我想到了这个(提琴);

基本上,我没有尝试从控制器调用指令,而是创建了一个模块来容纳所有弹出逻辑

var PopdownModule = angular.module('Popdown', []);

我在模块中放了两件事,一个factory用于可以在任何地方注入的API ,另一个directive用于定义实际popdown元素的行为:

工厂仅定义了几个函数successerror跟踪了几个变量:

PopdownModule.factory('PopdownAPI', function() {
    return {
        status: null,
        message: null,
        success: function(msg) {
            this.status = 'success';
            this.message = msg;
        },
        error: function(msg) {
            this.status = 'error';
            this.message = msg;
        },
        clear: function() {
            this.status = null;
            this.message = null;
        }
    }
});

该指令将API注入其控制器,并监视api的更改(为了方便起见,我使用bootstrap css):

PopdownModule.directive('popdown', function() {
    return {
        restrict: 'E',
        scope: {},
        replace: true,
        controller: function($scope, PopdownAPI) {
            $scope.show = false;
            $scope.api = PopdownAPI;

            $scope.$watch('api.status', toggledisplay)
            $scope.$watch('api.message', toggledisplay)

            $scope.hide = function() {
                $scope.show = false;
                $scope.api.clear();
            };

            function toggledisplay() {
                $scope.show = !!($scope.api.status && $scope.api.message);               
            }
        },
        template: '<div class="alert alert-{{api.status}}" ng-show="show">' +
                  '  <button type="button" class="close" ng-click="hide()">&times;</button>' +
                  '  {{api.message}}' +
                  '</div>'
    }
})

然后,我定义一个app依赖于的模块Popdown

var app = angular.module('app', ['Popdown']);

app.controller('main', function($scope, PopdownAPI) {
    $scope.success = function(msg) { PopdownAPI.success(msg); }
    $scope.error   = function(msg) { PopdownAPI.error(msg); }
});

HTML看起来像:

<html ng-app="app">
    <body ng-controller="main">
        <popdown></popdown>
        <a class="btn" ng-click="success('I am a success!')">Succeed</a>
        <a class="btn" ng-click="error('Alas, I am a failure!')">Fail</a>
    </body>
</html>

我不确定这是否完全理想,但是这似乎是一种使用具有全局意义的popdown指令建立通信的合理方法。

再次,作为参考,摆弄。



 类似资料:
  • 调用其他控制器 在控制器内直接使用 new 关键字实例化其他控制器类即可完成对其他控制器的调用 演示代码 在 index 控制器内调用 test 控制器并执行其 runme 方法 : test.php 源码 <?php class testController extends grace{ public function runme(){ echo 'run...'; } } index

  • 问题内容: 我可能会考虑将其完全倒退,但是我正在尝试制作三个嵌套指令,让它们称为:屏幕,组件和小部件。我希望窗口小部件能够触发组件中的某些行为,从而触发屏幕中的某些行为。所以: 我可以使用来在小部件的链接fn中要求父组件,但是如何进一步使组件控制器访问其包含的屏幕呢? 我需要的是WHAT in组件,因此,当您单击小部件的按钮时,它会发出“ screeny!”警报。 谢谢。 问题答案: 您可以通过以

  • 问题内容: 在上一个问题之后,我现在尝试从指令中调用父控制器上的方法。我得到一个未定义的参数。这是我的工作: 和脚本: 调用updatePerson方法时,person是未定义的。 jsfiddle在这里:http : //jsfiddle.net/graphicsxp/Z5MBf/7/ 问题答案: 只需简单地如下更改您的html 您没有通过updatePerson传递“人”,这就是为什么它不起作

  • 问题内容: 我想触发一个包含jQuery指令的AngularJS自定义指令。如何做呢?我已经在指令中阅读了关于发射功能的信息? 想法? 问题答案: 您可以使用服务在控制器和指令之间进行通信。 服务可能如下所示: 该指令可以响应服务: 只需将我所做的替换为jQuery操作,您就应该拥有所需的东西。 这是一个有效的小提琴:http : //jsfiddle.net/jeremylikness/wqXY

  • 我正在做一个项目,处理多个fxml和相应的控制器文件。我需要以某种方式从b.fxml的控制器访问定义在例如a.fxml中的fxml元素并使用它。 我不允许展示实际代码。但是,为此目的,我构建了一个简单的应用程序,其中包含两个FXML及其相应的控制器。 此应用程序具有带有ButtonController.java的Button.fxml和带有ProgressIndicator.fxml的Progre

  • null 我在TopMenuButtons中有一个按钮,它具有openAssisstantStage()方法,打开新的小阶段: 对于这个阶段,我还有FXML文件和控制器(AssisstantController)。只有2个按钮-第一个按钮应该打开前一个阶段和关闭电流,但第二个按钮也应该打开普雷沃阶段,关闭电流,也打开一个特定的标签在我的标签视图和做一些其他逻辑例如。获取实际localDate: 我