Я успешно реализовал FizzBuzz в угловатом и задавался вопросом, выполняю ли я все в соответствии с Angular Best Practices. Мои вопросы: 1) Есть ли способ установить $ scope.display на фабрике напрямую вместо того, чтобы что-то возвращать? так что вместо «return FIZZ» я могу сделать $ scope.display = «FIZZ» там? 2) Мне действительно нужны отдельные переменные $ scope.counter и $ scope.display?Игра FizzBuzz в Angular
Код:
angular.module('fizzbuzz', [])
.factory("Counter", function() {
var increment = function(number) {
if (number % 3 === 0 && number % 5 === 0) {
//any way to set $scope.display directly here?
return "FIZZBUZZ"
}
if (number % 3 === 0) {
return "FIZZ"
}
if (number % 5 === 0) {
return "BUZZ"
}
return number;
}
return {
increment: increment
}
})
.controller("FizzBuzz", function($scope, Counter) {
// is there any way to do this without a separate counter variable?
$scope.display = 0;
$scope.counter = 0;
$scope.increment = function() {
//increment the counter before going into the function, reacting to ng-click
$scope.counter++;
//call the factories function to actually display
$scope.display = Counter.increment($scope.counter);
}
})
// HTML:
<doctype! html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.19/angular.min.js"></script>
<script src="fizzbuzz.js"></script>
</head>
<body>
<div ng-app="fizzbuzz" ng-controller="FizzBuzz">
<h1 ng-click="increment()"> {{ display }} </h1>
</div>
</body>
</html>
Update:
принял предложение Шоном, чтобы попробовать это, но ничего не показывает:
angular.module('fizzbuzz', [])
.factory("Counter", function() {
var service = {};
service.number = 0;
service.display = "";
service.increment = function() {
service.number++;
if (service.number % 3 === 0 && service.number % 5 === 0) {
//any way to set $scope.display directly here?
service.display = "FIZZBUZZ"
}
if (service.number % 3 === 0) {
service.display = "FIZZ"
}
if (service.number % 5 === 0) {
service.display = "BUZZ"
} else {
service.display = service.number;
}
}
return service;
})
.controller("FizzBuzz", function($scope, Counter) {
// can reference method and data from the service
$scope.increment = Counter.increment;
$scope.display = Counter.display;
})
кажется, что это лучше подходит для HTTP: //codereview.stackexchange .com/ –
@NeilS хороший момент отправит туда в следующий раз! – devdropper87
обновил мое сообщение с помощью проблемы с запущенным сниппетом, когда вы копируете значения там, где вы не используете ссылку через исходный объект, поэтому обновления исходных объектов не обновляются эти копии – shaunhusain