Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
$data = json_decode(file_get_contents('php://input'), true);
app.controller('SomeController', ['$scope', 'DataCache', function ($scope, DataCache) {
...
}]);
<pre ng-bind="object_in_scope | 'json'"></pre>


<div ng-loaded="loaded">
view content
</div>
var users = Restangular.all('user').getList().then(function(data) {
// do something with response
});
var products = Restangular.all('product').getList().then(function(data) {
// do something with response
});
$scope.loaded = loadingService.add(users, products).wait();
angular.module('loadingService', [])
.factory('loadingService', ['$q', '$rootScope', function($q, $rootScope) {
var waited = [];
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
waited = []; // empty array when transition to new state
});
return {
add: function() {
for(var i in arguments) {
waited.push(arguments[i]);
}
return this;
},
wait: function() {
var ret = $q.defer();
$q.all(waited)['finally'](function() {
waited = [];
ret.resolve(1);
});
return ret.promise;
}
};
}])
.directive('ngLoaded', ['$compile', function($compile) {
return {
link: function(scope, element, attrs) {
var indicator = angular.element('<div><img src="assets/loader.gif" /> Loading...</div>');
indicator = $compile(indicator)(scope);
element.after(indicator);
scope.$watch(attrs.ngLoaded, function(newValue, oldValue) {
if(newValue) {
element.css({display: 'block'});
indicator.css({display: 'none'});
} else {
element.css({display: 'none'});
indicator.css({display: 'block'});
}
});
}
};
}])
;
factory('LoadRendererService', ['$rootScope', function LoadRendererService($rootScope) {
function setFlag(isLoaded)
{
$rootScope.controllerDataLoaded = !! isLoaded;
}
function setFlagLoadError(isError)
{
$rootScope.controllerDataLoadError = !! isError;
}
return {
setLoaded: function setLoaded()
{
setFlag(true);
},
setNotLoaded: function setLoaded()
{
setFlag(false);
},
setLoadError: function setLoadError(isError)
{
setFlagLoadError(isError);
}
};
}])
<div class="b-layout" ng-class="{'b-loader': ! controllerDataLoaded && ! controllerDataLoadError}">
</div>
controller('RegisterConfirmCtrl', ['$scope', 'LoadRendererService', 'RegisterConfirmService', function RegisterConfirmCtrl($scope, LoadRendererService, RegisterConfirmService) {
LoadRendererService.setNotLoaded();
RegisterConfirmService.get(function (response) {
LoadRendererService.setLoaded();
onLoad(response);
});
}])
ng-cloak можно использовать как css класс и если для него иметь определение в своих стилях, то сходу не очень понятно, какие там проблемы в «большинстве» случаев.pendingRequests. В остальных случаях это должно архитектурно решаться, а не ручным добавлением, удалением.$cacheFactory — может быть им пренебрегают, потому что простейший кэш — это все же не бином Ньютона. А вот то, что $cacheFactory в AngularJS — это LRU кэш (вытеснение давно неиспользуемых) из документации можно сходу и не понять.<div class="wrapper" ng-class="{smoothOpacity:true}">
...
</div>
.wrapper {
opacity: 0;
-moz-transition: opacity 0.6s ease;
-o-transition: opacity 0.6s ease;
-webkit-transition: opacity 0.6s ease;
transition: opacity 0.6s ease;
}
.smoothOpacity {
opacity: 1;
}
Несколько полезных приемов в AngularJS для начинающих