内容已编辑
目标是创建一个可以附加到文本框的指令,当文本框获得焦点时,文本框之后将出现一个图像/按钮,并且图像/按钮单击事件将触发包含在指令中的函数。目标是让这个功能在指令中完全独立,以便可以轻松地部署在许多页面或应用程序中。
图像/按钮出现在文本框之后没有问题,但按钮的单击事件不会触发该功能。我用示例代码 创建了一个plunkr 。
在 plunk 中,第 15 行定义了一个名为“搜索”的函数,它只不过是触发警报。当文本框获得焦点时,按钮按预期显示,第 34 行成功调用了搜索函数,这意味着该函数本身正在工作。但是,按钮的单击事件不会触发搜索功能。
原帖
我正在尝试在我们的应用程序中重新创建一些目前正在使用 jQuery 完成的功能。该功能涉及将伪类附加到文本框,然后由 jQuery 拾取,并在文本框之后立即将放大镜图像注入 DOM。单击图像会弹出一个对话框。
到目前为止,我完成的是一个简单的 html 页面、一个简单的控制器和一个简单的指令。当文本框具有焦点时,图像会按预期显示。但是,ng-click 指令不会触发。
这是html:
<input
id="txtAlias"
type="text"
ng-model="pc.results"
user-search />
</div>
这是控制器:
angular
.module('app')
.controller('PeopleController', PeopleController);
PeopleController.$inject = ['$http'];
function PeopleController() {
var pc = this;
pc.results = '';
pc.search = function () {
alert('test');
};
}
这是指令:
angular
.module('app')
.directive('userSearch', userSearch);
function userSearch($compile) {
return {
restrict: 'EAC',
require: 'ngModel',
//transclude: true,
scope: {
//search : function(callerid){
// alert(callerid);
//}
},
template: "The user's alias is: <b><span ng-bind='pc.results'></span>.",
//controller: UserSearchController,
link: function (scope, element, attrs) {
element.bind('focus', function () {
//alert(attrs.id + ' || ' + attrs.userSearch);
var nextElement = element.parent().find('.openuserdialog').length;
if (nextElement == 0) {
var magnifyingglass = $compile('<img src="' + homePath + 'Images/zoomHS.png" ' +
'alt="User Search" ' +
'ng-click="pc.search("' + attrs.id + '")" ' +
'class="openuserdialog">')(scope);
element.after(magnifyingglass);
}
});
}
};
};
目前,我很乐意通过在控制器中点击 pc.search 或在隔离范围内搜索来获得触发警报。到目前为止,两者都没有奏效。我敢肯定它缺少一些简单的东西,但我不知道是什么。
解决方案
感谢 Google 论坛上的一位用户向我展示了用于指令的 controllerAs 属性。这个版本现在可以完美运行:
angular
.module('app')
.directive('userSearch', userSearch);
function userSearch($compile){
return {
controller: function ()
{
this.search = function () {
alert('Test');
};
},
link: function (scope, element, attrs) {
element.bind('focus', function () {
var nextElement = element.parent().find('.openuserdialog').length;
if (nextElement === 0) {
var btn = '<img src="' + homePath + 'Images/zoomHS.png" ' +
'ng-click="userSearch.search()" ' +
'class="openuserdialog" />';
element.after($compile(btn)(scope));
}
});
},
controllerAs: 'userSearch'
};
};