angularjs使用ng-change从嵌套的ng控制器调用外部控制器

时间:2016-06-22 18:38:49

标签: javascript angularjs angularjs-ng-click angularjs-ng-change ng-init

我正在尝试使用angularjs来创建执行以下操作的页面:

  1. 最初为空,保存为自动下拉列表 填充了应用程序。
  2. 选择其中一个应用后,将调用相关数据 该页面的另一个控制器。
  3. 我成功地让下拉列表自动填充。但是,我在使用ng-change制作页面时遇到了问题,我认为这是由于嵌套的ng-controllers。我的浏览器根本没有调用chartappsuccessfullogins函数。谁能帮我?代码如下:

    我的主要HTML页面。注意使用ng-init:

        <div ng-controller="chartsuccessfulapploginsController">
            <div ng-controller="allappsController" ng-init="add()">
                <form name="myForm">
                    <label for="repeatSelect"> Repeat select: </label>
                    <select name="repeatSelect" id="repeatSelect" ng-model="data.repeatSelect" ng-change="chartsuccessfulapploginsController.add(value)">
                <option ng-repeat="option in data.availableOptions" ng-init="Index = $index"  value="{{data.availableOptions[Index].id}}" ng-model="APPID" >{{data.availableOptions[Index].name}}</option>
            </select>
                </form>
                <hr>
                <p> {{data}}</p>
                <p> {{data.id[0]}}</p>
                <p> {{data.name[0]}}</p>
    
                <tt>repeatSelect = {{data.repeatSelect}}</tt><br/>
            </div>
            <p>{{returnCount}}</p>
            <table border = "1">
                <tr>
                    <td>{{chartObject.data}}</td>
                    <td>{{returnCount}}</td>
    
                </tr>
            </table>
            <div google-chart chart="chartObject" style="height:600px; width:100%;"></div>
        </div>
    

    我的所有应用程序控制器。上面的html页面依赖于此来填充下拉列表。

    angular.module('scotchApp').controller('allappsController',['$scope', function($scope){
        var userurl='';
        $scope.add = function(){
    
            userurl = 'http://localhost:8085/rest/uafapp/appslist';
            var userdata = {};
            var userconfig =
            {
                headers: {
                    'Content-Type':'application/json'
                }
            };
            var userPostRequest = $.get(userurl, userdata, userconfig);
            var userjson = '{\"USER_DATA_RETRIEVED\" : \"fail\"}';
            userPostRequest.done(function(userdata){
    
                userjson = JSON.stringify(userdata);
                console.log("userjson :: " + userjson);
    
                var postResponse = jQuery.parseJSON(userjson);
                $scope.returnName = postResponse['apps'];
                var availableOptionsArray = [];
    
                for(i = 0; i < postResponse['apps'].length; i++){
                    var availableOptions = {};
                    availableOptions['id'] = postResponse['apps'][i]['appId'];
                    availableOptions['name'] = postResponse['apps'][i]['appName'];
                    availableOptionsArray[i] = availableOptions; 
                }
                var returnData = {};
                returnData['repeatSelect'] = null;
                returnData['availableOptions'] = availableOptionsArray;
    
                $scope.data = returnData;
                console.log($scope.returnData);
                $scope.$apply()
            });
    
        };
    }]);
    

    定义图表的控制器的一部分。它很长,所以我没有包含不相关的代码。

       angular.module('scotchApp').controller('chartsuccessfulapploginsController',['$scope','$route','$http','AuthTokenService', function($scope, $route, $http, AuthTokenService){
            var appurl = '';
            var failedappurl= '';
    
            $scope.add = function(APPID) {
    
    ...}
    

1 个答案:

答案 0 :(得分:0)

您的allappsController是否在控制器文件中的chartsuccessfulapploginsController内?

它应该在里面,因为allappsController子范围,而chartsuccessfulapploginsController父范围。您正尝试从子范围访问父范围

如果不在内部,则认为ng-change="chartsuccessfulapploginsController.add(value)"是新控制器。

如果这是问题,修复将是这样的:

    angular.module('scotchApp').controller('chartsuccessfulapploginsController',['$scope','$route','$http','AuthTokenService', function($scope, $route, $http, AuthTokenService){
            var appurl = '';
            var failedappurl= '';

            $scope.add = function(APPID) {} ...


            //allappsController inside chartsuccessfulapploginsController
            angular.module('scotchApp').controller('allappsController',['$scope',function($scope){
            var userurl='';
            $scope.add = function(){ ... };

           }]);
}]);

检查出来:Use ng-model in nested Angularjs controller