从$ scope上的动态评估函数绑定到服务

时间:2016-07-23 13:40:34

标签: javascript angularjs

我有一个函数make_value_summary,它通常会对$scope字段进行汇总。在这里,我使用它构建location_summary,通过ng-bind绑定到视图。每当字段location_summarystreetsuburb更新时,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);
});

修改

通过“评估”手表中的功能获得解决方案,即将'location_summary()'传递给$watch()。还是想回答我的第一个问题!

1 个答案:

答案 0 :(得分: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>
&#13;
&#13;
&#13;