Я создаю клиентский javascript SDK. Это упрощает запросы к внешнему API.
Но при использовании его в Angular я должен включить $ scope.apply (), как это, чтобы обновить DOM.
SDK.getUser(function(response) {
// Have to call $scope.$apply since SDK call is asynchronous and therefore updates outside of the AngularJS digest cycle
$scope.$apply(function() {
$rootScope.user = response.user;
});
}, function(error) {
console.log('Error Fetching User From SDK: ', error);
});
Как я могу изменить SDK, чтобы $ scope.apply () не записывался разработчиками, использующими SDK, после завершения его асинхронных вызовов?
Могу ли я передать $ scope в SDK и применить его внутри?
1 ответ
Как я могу изменить SDK, чтобы $ scope.apply () не записывался разработчиками, использующими SDK, после завершения его асинхронных вызовов?
Лучшим способом справиться с этим было бы создание оболочки службы angular над службой SDK, чтобы вам не нужно было беспокоиться о ручном вызове цикла дайджеста, поскольку angular будет вызывать цикл после выполнения обещания и для каждого обратного вызова в обещании цепь.
app.service('SDKWrapperService', ['$q',function($q){
this.getUser = function() {
var def = $q.defer();
SDK.getUser(function(response) {
def.resolve(response);
},function(error) {
def.reject('Error Fetching User From SDK: ', error);
});
return def.promise;
}
}]);
И используйте это как-то так: -
app.controller('myCtrl',['$scope','SDKWrapperService', function($scope, SDKWrapperSvc){
SDKWrapperSvc.getUser().then(function(data){
$scope.user = data.user;
})
});
Могу ли я передать $ scope в SDK и применить его внутри?
Я бы, вероятно, не стал этого делать, поскольку ваш клиентский javascript SDK (не angular) должен будет знать о том, что называется $scope
, и на самом деле он будет более тесно связан с angular выполнение.
Если задействовано не слишком много бизнес-логики, у вас может быть даже угловая версия вашего сервиса, использующая $http
в вашем наборе для разработчиков Angular.
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Имейте в виду, что JavaScript — это НЕ то же самое, что Java! Включите все ярлыки, относящиеся к вашему вопросу; например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [svelte] и т. д.
$q
, которые обеспечат вызов цикла дайджеста без необходимости делать это вручную.