gpt4 book ai didi

javascript - 从其他 Controller 调用指令 Controller 中的方法

转载 作者:IT王子 更新时间:2023-10-29 02:39:21 27 4
gpt4 key购买 nike

我有一个指令,它有自己的 Controller 。请看下面的代码:

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'
}

});

这是一个错误/通知/警告的通知系统。我想做的是从另一个 Controller (不是指令 Controller )调用此 Controller 上的函数 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');
}
});

所以当在popdown 指令 Controller 上调用show 时,链接函数也应该被触发并执行动画。我怎样才能做到这一点?

最佳答案

这是一个有趣的问题,我开始思考如何实现这样的东西。

我想出了 this (fiddle) ;

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

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

我在模块中放了两个东西,一个用于 API 的 factory 可以在任何地方注入(inject),以及 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 注入(inject)到其 Controller 中,并观察 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>'
}
})

然后我定义了一个依赖于Popdownapp模块:

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>

我不确定它是否完全理想,但它似乎是一种与全局弹出指令建立通信的合理方式。

同样,作为引用,the fiddle .

关于javascript - 从其他 Controller 调用指令 Controller 中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14883476/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com