У меня есть функция make_value_summary
которая в общем случае делает сводку полей $scope
. Здесь я использую его для создания location_summary
, связанного с представлением через ng-bind
. location_summary
обновляется всякий раз, когда поля street
, suburb
, или state
обновляются.
$scope.location_summary = function() {
var fields = [
'street',
'suburb',
'state',
];
return make_value_summary(fields, $scope, 'Location?');
};
function make_value_summary(fields, $scope, initial) {
var summary = '';
fields.forEach(function(field) {
if ($scope[field] && $scope[field] !== '0') {
if (summary) {
summary = summary + ', ' + $scope[field];
}
else {
summary = $scope[field];
}
}
});
if (summary) {
return summary[0].toUpperCase() + summary.substring(1);
}
else {
return initial;
}
}
Вопрос 1. Как динамическое обновление location_summary
, начиная с моего первоначального взгляда на код, похоже, что make_value_summary
должен выполняться только один раз, когда сначала назначается location_summary
.
Вопрос 2: Я хочу привязать location_summary
к совершенно другой части представления через службу. Как мне следует привязать location_summary
к сервису Location
. Я пробовал использовать $watch
но без успеха.
$scope.$watch('location_summary', function(newValue, oldValue) {
// Just gives unevaluated reference to location_summary function
console.log(newValue);
console.log(oldValue);
});
РЕДАКТИРОВАТЬ
Получено решение 2. путем "оценки" функции в часах, т.е. Передать 'location_summary()'
в $watch()
. Еще хотелось бы ответить на мой первый вопрос!
На основе ваших кодов, пожалуйста, запустите этот фрагмент.
angular.module("app",[])
.controller("appController",appController);
appController.$inject=["$scope"];
function appController($scope){
$scope.location_summary = function() {
var fields = [
'street',
'suburb',
'state',
];
return make_value_summary(fields, $scope, 'Location?');
};
function make_value_summary(fields, $scope, initial) {
var summary = '';
fields.forEach(function(field) {
if ($scope[field] && $scope[field] !== '0') {
if (summary) {
summary = summary + ', ' + $scope[field];
}
else {
summary = $scope[field];
}
}
});
if (summary) {
return summary[0].toUpperCase() + summary.substring(1);
}
else {
return initial;
}
}
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<body ng-app="app" ng-controller="appController">
<input ng-model="street">
<input ng-model="suburb">
<input ng-model="state">
{{location_summary()}}
</body>