如何从angularjs中选择的ng-change调用服务方法?

Posted

技术标签:

【中文标题】如何从angularjs中选择的ng-change调用服务方法?【英文标题】:how to call service method from ng-change of select in angularjs? 【发布时间】:2014-01-07 13:55:30 【问题描述】:

我是 Angular js 的新手。我正在尝试从 select 的 ng-change 调用工厂服务方法“getScoreData”,但无法完成。请帮忙。

html代码:

<select ng-model="Score" ng-change="getScoreData(Score)" ng-options="c.name for c in     Scores"></select>

Angularjs 代码:

var app = angular.module('audiapp', []);

app.controller('audiLayoutCtrl', function ($scope, ScoreDataService) 
    ScoreDataService.getScoreData($scope.Score, function (data) 
        $scope.ScoreData = data;
    );
);

app.factory('ScoreDataService', function ($http) 
    return 
        getScoreData: function (Score, callback) 
            var params = 
                questionCode: Score.code
            

            return $http(
                url: 'Home/GetAvgData',
                method: 'GET',
                params: params
            ).success(callback);
        
    ;
);

上面是服务工厂方法及其从控制器的实例化。我尝试从 select 的 ng-change 实例化,但它既没有给出错误也没有被调用。

【问题讨论】:

【参考方案1】:

您的代码中至少有两个问题:

ng-change="getScoreData(Score)

Angular 没有看到引用已定义服务的 getScoreData 方法

getScoreData: function (Score, callback)

我们不需要使用回调,因为GET 返回承诺。请改用then

这是一个工作示例(我仅使用随机地址进行模拟):

HTML

<select ng-model="score"
        ng-change="getScoreData(score)" 
        ng-options="score as score.name for score in  scores"></select>
    <pre>ScoreData|json</pre> 

JS

var fessmodule = angular.module('myModule', ['ngResource']);

fessmodule.controller('fessCntrl', function($scope, ScoreDataService) 

    $scope.scores = [
        name: 'Bukit Batok Street 1',
        URL: 'http://maps.googleapis.com/maps/api/geocode/json?address=Singapore, SG, Singapore, 153 Bukit Batok Street 1&sensor=true'
    , 
        name: 'London 8',
        URL: 'http://maps.googleapis.com/maps/api/geocode/json?address=Singapore, SG, Singapore, London 8&sensor=true'
    ];

    $scope.getScoreData = function(score) 
        ScoreDataService.getScoreData(score).then(function(result) 
            $scope.ScoreData = result;
        , function(result) 
            alert("Error: No data returned");
        );
    ;

);

fessmodule.$inject = ['$scope', 'ScoreDataService'];

fessmodule.factory('ScoreDataService', ['$http', '$q', function($http) 

    var factory = 
        getScoreData: function(score) 
            console.log(score);
            var data = $http(
                method: 'GET',
                url: score.URL
            );


            return data;
        
    
    return factory;
]);

演示Fiddle

【讨论】:

以上是关于如何从angularjs中选择的ng-change调用服务方法?的主要内容,如果未能解决你的问题,请参考以下文章

angularjs的ng-change事件演示

IE 11 没有触发“ng-change”(AngularJS)

Angularjs 1.5.7 ng-change 从组件不起作用

使用 ng-model 时 AngularJS $scope 不更新(ng-change 触发?)

$event.target 的 AngularJS 复选框 ng-change 问题

angularjs自定义指令中的ng-change函数在用户第二次输入后更新输入值