Kluczem do rozwiązania tego problemu jest to, że ciebie Muszę użyć usługi $ compile na HTML zwróconym przez funkcję formatNoMatches
w obiekcie opcji. Ten krok kompilacji spowoduje powiązanie dyrektywy ng-click w znacznikach z zakresem. Niestety, jest to nieco łatwiej powiedzieć niż zrobić.
Można zobaczyć pełną przykład pracuje tu: http://jsfiddle.net/jLD42/4/
Nie ma mowy o tym nie wiem za angularjs obserwować kontrolę select2 monitorowania wyników wyszukiwania, więc musimy poinformować sterownika Po nie znaleziono wyników. Łatwo to zrobić za pomocą funkcji formatNoMatches
:
$scope.select2Options = {
formatNoMatches: function(term) {
console.log("Term: " + term);
var message = '<a ng-click="addTag()">Add tag:"' + term + '"</a>';
if(!$scope.$$phase) {
$scope.$apply(function() {
$scope.noResultsTag = term;
});
}
return message;
}
};
Obiekt $scope.noResultsTag
śledzi ostatniej wartości wprowadzonej przez użytkownika, który nie przyniosło wyników. Zawieszenie aktualizacji do $scope.noResultsTag
z $ scope. $ Apply jest konieczne, ponieważ formatNoMatches
jest wywoływany poza kontekstem pętli podsumowania AngularJS.
Możemy oglądać $scope.noResultsTag
i skompilować znaczników formatNoMatches
razie wystąpienia zmian:
$scope.$watch('noResultsTag', function(newVal, oldVal) {
if(newVal && newVal !== oldVal) {
$timeout(function() {
var noResultsLink = $('.select2-no-results');
console.log(noResultsLink.contents());
$compile(noResultsLink.contents())($scope);
});
}
}, true);
Można się zastanawiać, co $ timeout tam robi. Jest używany do uniknięcia sytuacji wyścigowej pomiędzy kontrolką select2 aktualizującą DOM a znacznikiem formatNoMatches
, a funkcją watch próbuje skompilować ten znacznik. W przeciwnym razie istnieje duża szansa, że selektor $('.select2-no-results')
nie znajdzie tego, czego szuka, a krok kompilacji nie będzie miał nic do skompilowania.
Po utworzeniu łącza dodawania tagu, dyrektywa ng-click
będzie mogła wywołać funkcję addTag
na kontrolerze. Możesz to zobaczyć w akcji w jsFiddle. Kliknięcie linku Dodaj tag spowoduje aktualizację tablicy Znaczniki z wyszukiwanym terminem wprowadzonym do kontrolki select2, a będziesz mógł zobaczyć to w znacznikach i liście opcji, gdy następnym razem wprowadzisz nowe wyszukiwane hasło do kontrolki select2.
możesz dodać go w zakresie .. tj. $ scope.addTag = function() { } – insomiac
Od wielu lat walczę z tymi samymi problemami. Mam wrażenie, że kątowy musi być mówiony o znaczniku , który robimy. Ale nie mogę zrozumieć, jak. – Manu