Привязка динамически вычисляемой функции в $ scope к сервису

0

У меня есть функция 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(). Еще хотелось бы ответить на мой первый вопрос!

Теги:

1 ответ

0

На основе ваших кодов, пожалуйста, запустите этот фрагмент.

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>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню