我正在尝试从James Smith的tokenInput Jquery插件创建一个angular.js指令:http://loopj.com/jquery-tokeninput
这是我到目前为止所做的:
antdna = angular.module('Communication', []);
antdna.factory('autoCompleteService', [function() {
return {
getSource: function() {
return [{"id":1, "name":"John Doe"}, {"id":2, "name":"Jane Smith"}];
}
}
}]);
antdna.directive('autoComplete', function(autoCompleteService) {
return {
restrict: 'A',
link: function(scope, elem) {
elem.tokenInput(autoCompleteService.getSource(), {
crossDomain:false,
theme: "facebook",
hintText: "Enter User Name",
preventDuplicates: true
});
}
};
});
使用以下标记:
<input type="text" name="recipient" ng-model="conversation.recipients" class="messageComposeTextField" auto-complete placeholder="To :" required />
TokenInput工作正常但我的问题是我无法绑定到模型。
{{conversation.recipients}}
是空白的。
tokenInput插件使用列表元素(ul和li)生成它自己的标记。所以在检查元素后我得到了:
<ul class="token-input-list-facebook">
<li class="token-input-token-facebook"><p>John Doe</p><span class="token-input-delete-token-facebook">×</span></li><li class="token-input-input-token-facebook"><input type="text" autocomplete="off" autocapitalize="off" id="token-input-" style="outline: none; width: 30px;"><tester style="position: absolute; top: -9999px; left: -9999px; width: auto; font-size: 12px; font-family: Ubuntu, 'Ubuntu Beta', UbuntuBeta, Ubuntu, 'Bitstream Vera Sans', 'DejaVu Sans', Tahoma, sans-serif; font-weight: 400; letter-spacing: 0px; white-space: nowrap;"></tester> </li>
</ul>
<input type="text" name="recipient" ng-model="conversation.recipients" class="messageComposeTextField ng-pristine ng-invalid ng-invalid-required" auto-complete="" placeholder="To :" required="" style="display: none;">
请注意,生成的tokenInput标记不是指令的一部分。所以真正的问题是如何封装一个jquery插件,在一个angularjs指令中生成自己的标记?
答案 0 :(得分:10)
跟进@JqueryGuru的建议,也许你有兴趣看看我最近实现的标签输入指令:ngTagsInput。它是100%Angular代码,有几个配置选项。您可以看到一些演示here。
答案 1 :(得分:3)
我建议您使用ui-select2 ready to use指令来实现类似的功能@ https://github.com/angular-ui/ui-select2,它提供了与您的要求类似的“简单标记模式”
检查new example。可以找到旧示例here。
$scope.tagsSelection = [
{ "id": "01", "text": "Perl" },
{ "id": "03", "text": "JavaScript" }
];
$timeout(function(){
$scope.tagsSelection.push({ 'id': '02', 'text': 'Java' });
}, 3000);
$scope.tagData = [
{
"id": "01",
"text": "Perl"
},
{
"id": "02",
"text": "Java"
},
{
"id": "03",
"text": "JavaScript"
},
{
"id": "04",
"text": "Scala"
}
];
$scope.tagAllOptions = {
multiple: true,
data: $scope.tagData
};
查看选项和文档的详细信息
答案 2 :(得分:0)
我有类似的问题,而备用插件和Angular自己的标签指令非常有趣,但由于某些项目要求,我无法更改令牌输入插件,因此我在添加/删除配置中添加了模型更新逻辑令牌输入插件的变量。
守则:
vehicleModule.directive('tokenInput', function ($rootScope,$parse, $http){
return {
restrict: 'A',
link: function(scope, elem, attr, ctrl) {
var prepopMailsJson = getElementsAsJson(elem.attr('value'));
elem.tokenInput(applicationRootUrl +"rest/firmwareManager/getAvailableVehicles", {
prePopulate: prepopMailsJson,
theme: "facebook",
minChars: 2,
resultsLimit: 12,
propertyToSearch: "id",
resultsFormatter: function(item){
var name = "";
if(typeof(item.name) != 'undefined' && item.name != null){
name = item.name;
}
return "<li>" + "<div style='display: inline-block; padding-left: 10px;'><div class='id'>" + item.id + "</div></div></li>";
},
tokenFormatter: function(item) {
return "<li><p>" + item.id + "</p></li>";
},
hintText: vehicleTokenInputTranslation.hintText,
noResultsText: vehicleTokenInputTranslation.noResultsText,
searchingText: vehicleTokenInputTranslation.searchingText,
preventDuplicates: true,
queryParam: "partialName",
tokenLimit: 1,
onAdd : function(item){
scope.vehicleId = item.id;
},
onDelete : function(item){
scope.vehicleId = '';
scope.$apply();
}
});
}
};
});
这样,您只需要在input元素中使用token-input指令即可。通过在attr中传递模型变量名称,可以使这更加通用。我希望这段代码对于集成JqueryUI Token-Input和AngularJS有问题的人有用。
答案 3 :(得分:0)
对于因任何原因需要使用loopj令牌输入的人,this gist对我来说非常适合。我发现它有点神秘,因为我对Angular不是很有经验而且他只有2条评论,所以这就是我对如何使用它的想法。
您包括顶级jquery模块,如:
angular.module('myModule', ['jquery'])
在html中你有:
<input token-input="source">
在javascript中你有:
$scope.source = {/* data */};
$scope.tokenInput = {/* options */}
如果你想要有几个不同的选项,看起来你也可以这样做:
<input id="id" token-input="source">
$scope.source = {/* data */};
$scope.tokenInput_id = {/* options */}