Как получить доступ к моей области angular с помощью диалоговых кнопок jQuery?

http://plnkr.co/edit/Rf0VItthVBg6j0z7KudO

Я использую диалог jQuery и хочу использовать диалоговые кнопки, но я не знаю, как попасть в область действия, чтобы вызвать (в настоящее время несуществующий) вызов $http или $resource на сервер с помощью обновленная модель при нажатии кнопки диалога jQuery. Мне кажется, что я собираюсь сделать это неправильно, но я не знаю, в каком направлении идти здесь.

Ответ 1

Вы можете использовать функции Angular, чтобы найти область, прикрепленную к элементу, и вызвать на ней функцию. Я предпочитаю действительно абстрагировать его и находить корень ng-app и транслировать событие в приложение, чтобы внешний код не знал о специфике внутреннего кода, кроме события, которое вы транслировали.

angular.$externalBroadcast = function (selector, event, message) {
    var scope = angular.element(selector).scope();

    scope.$apply(function () {
        scope.$broadcast(event, message);
    });
};

Затем из любого кода вы можете вызвать что-то вроде:

angular.$externalBroadcast('#app-container', 'doSomething', parameters);

И внутри приложения я бы сделал что-то вроде этого:

$rootScope.$on('doSomething', function(parameters) {
    // handle the external event.
});

Если вам не нравится этот подход, просто получите область действия:

var scope = angular.element(selector).scope();

И сделай что-нибудь с этим. Просто убедитесь, что вы вызываете scope.$apply, иначе цикл пищеварения не произойдет.

Ответ 2

Лучший способ - добавить директиву в управление. Плохая идея добавить jQuery с угловыми сторонами. Директива сделана для такого рода манипуляций.

Здесь я изменил ваш plunkr, чтобы показать вам, что вы можете делать с директивами.

app.directive('date', function() {
  return {
     restrict: 'A',
     require: '^ngModel',
     link: function(scope, elm, attrs, ctrl) {
       var dp = $(elm);

       dp.datepicker({
         onSelect: function(dateText) {
           scope.$apply(function() { // Apply cause it is outside angularjs
            ctrl.$setViewValue(dateText); // Set new value of datepicker to scope
           });
        }
       });

       scope.$watch(attrs.ngModel, function(nv) {
         dp.datepicker('setDate', nv); // Update datePicker date when scope change
       });
     }
  }