gpt4 book ai didi

angularjs - 如何创建 AngularJS jQueryUI 自动完成指令

转载 作者:行者123 更新时间:2023-12-04 23:50:15 26 4
gpt4 key购买 nike

我正在尝试创建一个使用 jQueryUI 的自动完成小部件的自定义指令。我希望这尽可能具有声明性。这是所需的标记:

<div>
<autocomplete ng-model="employeeId" url="/api/EmployeeFinder" label="{{firstName}} {{surname}}" value="id" />
</div>

因此,在上面的示例中,我希望指令对指定的 url 执行 AJAX 调用,并在返回数据时,显示根据文本框中结果的表达式计算的值,并将 id 属性设置为员工 ID。这是我对指令的尝试。
app.directive('autocomplete', function ($http) {
return {
restrict: 'E',
replace: true,
template: '<input type="text" />',
require: 'ngModel',

link: function (scope, elem, attrs, ctrl) {
elem.autocomplete({
source: function (request, response) {
$http({
url: attrs.url,
method: 'GET',
params: { term: request.term }
})
.then(function (data) {
response($.map(data, function (item) {
var result = {};

result.label = item[attrs.label];
result.value = item[attrs.value];

return result;
}))
});
},

select: function (event, ui) {
ctrl.$setViewValue(elem.val(ui.item.label));

return false;
}
});
}
}
});

所以,我有两个问题 - 如何评估 label 属性中的表达式以及如何将属性从 value 属性设置为我的范围内的 ngModel 。

最佳答案

这是我更新的指令

(function () {
'use strict';

angular
.module('app')
.directive('myAutocomplete', myAutocomplete);

myAutocomplete.$inject = ['$http', '$interpolate', '$parse'];
function myAutocomplete($http, $interpolate, $parse) {

// Usage:

// For a simple array of items
// <input type="text" class="form-control" my-autocomplete url="/some/url" ng-model="criteria.employeeNumber" />

// For a simple array of items, with option to allow custom entries
// <input type="text" class="form-control" my-autocomplete url="/some/url" allow-custom-entry="true" ng-model="criteria.employeeNumber" />

// For an array of objects, the label attribute accepts an expression. NgModel is set to the selected object.
// <input type="text" class="form-control" my-autocomplete url="/some/url" label="{{lastName}}, {{firstName}} ({{username}})" ng-model="criteria.employeeNumber" />

// Setting the value attribute will set the value of NgModel to be the property of the selected object.
// <input type="text" class="form-control" my-autocomplete url="/some/url" label="{{lastName}}, {{firstName}} ({{username}})" value="id" ng-model="criteria.employeeNumber" />

var directive = {
restrict: 'A',
require: 'ngModel',
compile: compile
};

return directive;

function compile(elem, attrs) {
var modelAccessor = $parse(attrs.ngModel),
labelExpression = attrs.label;

return function (scope, element, attrs) {
var
mappedItems = null,
allowCustomEntry = attrs.allowCustomEntry || false;

element.autocomplete({
source: function (request, response) {
$http({
url: attrs.url,
method: 'GET',
params: { term: request.term }
})
.success(function (data) {
mappedItems = $.map(data, function (item) {
var result = {};

if (typeof item === 'string') {
result.label = item;
result.value = item;

return result;
}

result.label = $interpolate(labelExpression)(item);

if (attrs.value) {
result.value = item[attrs.value];
}
else {
result.value = item;
}

return result;
});

return response(mappedItems);
});
},

select: function (event, ui) {
scope.$apply(function (scope) {
modelAccessor.assign(scope, ui.item.value);
});

if (attrs.onSelect) {
scope.$apply(attrs.onSelect);
}

element.val(ui.item.label);

event.preventDefault();
},

change: function () {
var
currentValue = element.val(),
matchingItem = null;

if (allowCustomEntry) {
return;
}

if (mappedItems) {
for (var i = 0; i < mappedItems.length; i++) {
if (mappedItems[i].label === currentValue) {
matchingItem = mappedItems[i].label;
break;
}
}
}

if (!matchingItem) {
scope.$apply(function (scope) {
modelAccessor.assign(scope, null);
});
}
}
});
};
}
}
})();

关于angularjs - 如何创建 AngularJS jQueryUI 自动完成指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24205514/

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