2016-07-07 3 views
4

Перед тем, как AngularJS 1.5, в директивах или представлениях, будет проверен, будет ли изменение изменено угловым (с использованием цикла $ digest), когда изменение было произведено от стороннего асинхронного обратного вызова должен был запустить ваш код в вызове $scope.$apply().Сторонний асинхронный обратный вызов в компоненте AngularJS 1.5 Компонент

С компонентами, насколько я понял, идея состоит в том, чтобы избавиться от $scope и просто привязать шаблон к контроллеру компонента. Я пытаюсь перейти к написанию компонентов вместо представлений, не полагаясь на $ scope. Скажем, у меня есть следующий код:.

function CompController(TPApi) { 
    let self = this; 
    this.endCallback = false; 
    TPApi.call(data,() => this.endCallback = true); 
} 

angular.module('app', []).component('myComp', { 
    controller: CompController, 
    template: '<div><span ng-show="$ctrl.endCallback">Callback Called</span></div>' 
}) 

Проблема здесь состоит в том, что ng-show двойной переплетены к контроллеру, но без использования $ объема $ применяется() для обратного вызова, изменение не будет подобран с помощью ng-show, так как цикл $ digest не запускается. Это очень раздражает, потому что мне придется затем ввести $ scope в контроллер и вызвать $ apply, но это побеждает цель полагаться на $ scope в первую очередь.

Я предполагаю, что способ состоит в том, чтобы инкапсулировать TPApi с помощью службы $q, тем самым гарантируя, что вызывается цикл $ digest, когда вызывается обратный вызов. Но что, если в какой-то момент я хочу перейти на новый API Promise вместо $q?

Есть ли разумный способ сделать это, не вызывая $ digest или угловатый 1 просто по своей сути ошибочный из-за $ scope и $ digest?

+0

Можете ли вы воспроизвести это поведение в скрипке? Ваш пример ведет себя нормально, модель обновляется после вызова api. – gyc

+0

Здесь вы найдете: https://jsfiddle.net/xgcphw0m/4/ Используемая геолокация. Если вы использовали угловое обслуживание, например $ q или $ http, оно будет работать, но это связано с тем, что они завершают обратный вызов с помощью $ apply. Этого я хочу избежать. –

+0

К сожалению, я мало знаю об es6. – gyc

ответ

0

Поскольку вы вызываете сторонний API, вам придется разрешить угловое обновление и распознавание новых данных. Если вы не хотите использовать $ scope, вы можете обернуть свой код с помощью $ timeout (который вызывает цикл дайджеста для вас)

function CompController(TPApi) { 
    let self = this; 
    this.endCallback = false; 
    TPApi.call(data,() => $timeout(() => this.endCallback = true, 0)); 
} 
Смежные вопросы