2016-06-27 2 views
0

У меня есть на моем сайте код, подобный следующему:Как вызвать директиву Angularjs после возврата другой функции?

<div ng-click=someFunction() my-directive>...</div> 
<div ng-show=showMe>...</div> 

Функция SomeFunction() выглядит следующим образом:

function onSuccess() { 
    // do something 
    console.log("in response") 
} 
function someFunction() { 
    $http( 
     { 
     ... 
     }).then(onSuccess); 

} 

директива моей директивы создается следующим образом:

app.directive(myDirective, function() { 
    return { 
     restrict: 'A', 
     link: function(scope, $elm) { 
       $elm.on('click', function() { 
        console.log("in directive"); 
        //do something 
       }); 
     } 
    } 
}); 

Проблема в том, что мне нужна директива для запуска только после того, как onSuccess закончил то, что он загрузил, а не раньше (то есть, я хочу видеть в conso le «в ответе» до «в директиве» и прямо сейчас я вижу «в директиве»)

Похоже, что-то можно сделать, но я не могу найти, как ... Любая помощь/идеи будут оценены!

EDIT: Я только что видел этот ответ: Wait for data in controller before link function is run in AngularJS directive Это не то, что я ищу, как функцию SomeFunction не зависит от директивы, и я хочу, чтобы оставаться как можно более независимыми (функция помещается в контроллере приложения, и я не хочу манипулировать просмотром прямо оттуда).

EDIT 2: Мне известно о возможности использования таймаута, но я бы предпочел использовать более общее решение. С таймаутом мне придется угадать, как долго ждать, и я не хочу полагаться на это.

EDIT 3: Я отредактировал функцию someFunction на более конкретную. Я не могу изменить структуру someFunction, и я не хочу делать работу директивы в onSuccess.

еще раз спасибо!

+0

Это [SO ответ] (HTTP://stackoverflow.com/a/27486190/3567063) может быть то, что вы ищете. Пожалуйста, проигнорируйте этот комментарий. –

+0

@alex_andrea Я бы предложил то же самое, но я не думаю, что он будет работать с директивами атрибутов и прослушивателем кликов на одном и том же объекте. Вы можете добавлять или удалять только элемент с помощью 'ng-if', а не атрибута элемента. –

+0

@ ssc-hrep3 Я никогда об этом не думал. Спасибо за указание.:) –

ответ

0

Если вы добавляете несколько прослушивателей событий к одному элементу, они выполняются в порядке вызовов addEventListener(). Например,

e.addEventListener('click', function(){ console.log('Click 1'); }); 
e.addEventListener('click', function(){ console.log('Click 2'); }); 

Сначала отобразится «Click 1», затем «Click 2». Это не похоже на Angular, потому что вы говорите, что директива срабатывает в первую очередь.

Если вы можете изменить директиву, я бы просто подождал 100 мс или около того.

link: function(scope, $elm) { 
    $elm.on('click', function() { 
     $timeout(function(){ 
      console.log("in directive"); 
       //do something 
      }); 
     }, 100); 
    } 

, чтобы дать контроллеру время для выполнения своих задач.

+0

привет, тайм-аут, вероятно, выполнит эту работу, но я ищу более общее решение (и, как вы писали, eventlisteners здесь не актуальны). Спасибо, в любом случае! – hashark

0

Я рекомендую вам использовать другой подход. Не используйте нг щелчок, но передать вашу функцию в вашу директиву

app.directive(myDirective, function() { 
    return { 
     restrict: 'A', 
     link: function(scope, $elm, iattrs) { 
      $elm.on('click', function() { 
       scope.$eval(iattrs.myDirective) 
       .then(function(response) { 
        console.log("in directive"); 
        //do something 
       }); 
      }); 
     } 
    } 
}); 

Пожалуйста, смотрите эту plunker: https://plnkr.co/edit/PaV6cCn0NmpBIVaJGAEL?p=preview

Предполагалось, функция возвращает обещание

+0

привет, спасибо. Проблема в том, что функция someFunction вызывает http, и я хочу, чтобы директива вызывалась после завершения ее обратного вызова. – hashark

+0

Не понимаю. $ http вернуть обещание, которое вы можете вернуть, вместо моего примера с обещанием. И вы можете выполнить код директивы после ответа $ http send. Когда вы сказали, что «директива будет вызвана после завершения обратного вызова», вам нужна функция углового вызова после? – Silvinus

+0

Я просто не могу этого сделать. Мой код работает по-разному, и я не могу вернуть обещание. – hashark

Смежные вопросы