【发布时间】:2014-09-03 13:15:23
【问题描述】:
我实际上是从这样的控制器调用指令函数:
function myControllerFunction = function () {
$scope.highlight();
}
highlight(),是指令中的一个函数。
如果我有两个不同的指令,每个指令都有自己的highlight() 函数怎么办?
有没有办法获取实际的指令object,而不是直接通过$scope访问指令函数?
我希望明确说明我想使用的指令,如下所示:
function myControllerFunction = function () {
$scope.myDirective.highlight();
}
这可能吗?
如果你想知道为什么我想让控制器与指令对话,这里有一个例子:
我的控制器从用户那里收到一个身份验证密码并将其提交给服务。如果 pin 有效,则服务返回 true,否则返回 false。
在我的控制器函数中,我检查布尔返回值。如果是真的,我调用一个指令函数,叫做highlight,如果它是真的,它只是将一个div高亮为绿色,否则,我调用它以红色高亮它。
这是我的控制器功能:
$scope.keypadEnter = function () {
userService.isCodeValid($scope.code).then(function (result)
{
if (JSON.parse(result.data)) {
$scope.highlight("lime").then(function () {
$scope.code = "";
$location.path('/clockin');
});
}
else
{
$scope.highlight("red").then(function () {
$scope.resetDisplay();
$scope.code = "";
});
}
});
};
这是我的指令的高亮功能:
...
link: function ($scope, $element, $attrs) {
$scope.highlight = function (color) {
var deferred = $q.defer();
$element.effect("highlight", { color: color }, 500);
$element.find("span").css('color', '#000')
.animate({ opacity: 0 }, 500, function () {
$element.find("span").css('opacity', 1).css('color', '#fff')
});
$timeout(deferred.resolve, 500);
return deferred.promise;
}
...
根据您的建议,我已更改指令代码以监视 $scope.color 变量,如下所示:
angular.module('clockin').directive('grDisplay', function ($q, $timeout) {
return {
restrict: 'A',
link: function ($scope, $element, $attrs) {
$attrs.observe('color', function (color) {
var deferred = $q.defer();
$element.effect("highlight", { color: color }, 500);
$element.find("span").css('color', '#000')
.animate({ opacity: 0 }, 500, function () {
$element.find("span").css('opacity', 1).css('color', '#fff')
});
$timeout(deferred.resolve, 500);
return deferred.promise;
});
}
}
});
这是我的视图代码:
<div data-gr-display ng-attr-color="{{ color }}" class="display"><span>{{code}}</span></div>
但我收到此错误:
TypeError: object doesn't support this property or method « observe »
at link (http://localhost:18000/App/clockin/keypad/display-directive.js:6:13)
at nodeLinkFn (http://localhost:18000/Scripts/angular.js:6692:13)
...
【问题讨论】:
-
与其从控制器显式调用函数,在每个指令的链接函数中显式定义作用域对象不是更容易混淆吗?即 $scope.highlightA = 等?然后调用 $scope.highlightA 或 B?
-
这是个好主意。谢谢 !唯一的事情是,因为我已经阅读了下面 Adlen 的回答,我不确定我是否做对了(从控制器方法调用指令)。有没有更好的方法来完成这项工作?
-
这通常是服务的工作,将它注入你的控制器并使用它的方法或数据对象,但如果这对你有用,我想没关系(直到它不是问题:P )
-
我刚刚用一个可能的实现更新了我的答案,看看,让我知道它是否适合你。
标签: javascript angularjs angularjs-directive scope