Недавно я выбрал AngularJS над ember.js для проекта, над которым я работаю, и до сих пор был очень доволен. Одна приятная вещь об ember - это встроенная поддержка "вычисляемых свойств" с автоматической привязкой данных. Я смог выполнить что-то подобное в Angular с помощью кода ниже, но не уверен, что это лучший способ сделать это.
// Controller
angular.module('mathSkills.controller', [])
.controller('nav', ['navigation', '$scope', function (navigation, $scope) {
// "Computed Property"
$scope.$watch(navigation.getCurrentPageNumber, function(newVal, oldVal, scope) {
scope.currentPageNumber = newVal;
});
$scope.totalPages = navigation.getTotalPages();
}]);
// 'navigation' service
angular.module('mathSkills.services', [])
.factory('navigation', function() {
var currentPage = 0,
pages = [];
return {
getCurrentPageNumber: function() {
return currentPage + 1;
},
getTotalPages: function() {
return pages.length;
}
};
});
// HTML template
<div id=problemPager ng-controller=nav>
Problem {{currentPageNumber}} of {{totalPages}}
</div>
Я бы хотел, чтобы пользовательский интерфейс обновлялся всякий раз, когда изменяется currentPage
службы navigation
, которую выполняет вышеприведенный код.
Это лучший способ решить эту проблему в AngularJS? Имеются ли (значительные) последствия для использования $watch()
как это? Было бы лучше сделать что-то подобное с помощью пользовательских событий и $emit()
или $broadcast()
?