从另一个调用一个控制器

时间:2016-04-16 11:25:34

标签: javascript angularjs

我是AngularJs的新手,所以请耐心等待我。

我有以下角度应用程序,其中包含两个控制器

(function () {
    angular.module("app-machines", ['ngFlatDatepicker'])
    .controller('mainController', ['$scope', mainController])
    .controller("machinesController", machinesController);;

    function mainController($scope) {
        $scope.datepickerConfig_From = {
            allowFuture: true,
            dateFormat: 'DD.MM.YYYY',
            minDate: moment.utc('2015-09-13'),
            maxDate: moment.utc('2015-09-17')
        };

        $scope.datepickerConfig_To = {
            allowFuture: true,
            dateFormat: 'DD.MM.YYYY',
            minDate: moment.utc('2015-09-13'),
            maxDate: moment.utc('2015-09-17')
        };

        $scope.date_from = "14.09.2015";
        $scope.date_to = "15.09.2015";

        $scope.change = function () {
            //somehow execute machinesController get function
        };

    }

    function machinesController($http) {
        var vm = this;
        vm.errorMessage = "";
        vm.machines = [];

        $http.get("/api/machine/2015-09-14_2015-09-16")
        .then(function (response) {
            //success
            angular.copy(response.data, vm.machines);
        }, function (error) {
            //failure
            vm.errorMessage = "Failed to load data:" + error;
        });

    }
})();

我的machinesController应该使用参数调用GET函数。这里的参数是2015-09-14,第二个是2015-09-16(现在它们是硬编码的)。

我想要实现的是,我的主页上有两个输入控件,它触发$scope.change函数(位于第一个mainController的底部)。在这里,我想将date_fromdate_to的值传递给GET函数,以便我可以检索某些值。

我能做什么(最后,如果没有任何作用)是将颂歌从machinesController复制到我的mainController,这将解决问题。

但是我想学习如何更好地使用它,因此我想学习如何以正确的方式(在这种情况下从另一个模块中调用一个模块)。

为了达到这个目的,我需要改变什么?

修改

如上所述,我拥有machinesController的原因是为了卸载json数据并将其显示给用户。所以最后在我的html代码中我有以下内容:

    <div ng-controller="machinesController as vm" class="col-md-6 col-md-offset-3">
        <div class="text-danger" ng-show="vm.errorMessage"> {{ vm.errorMessage }}</div>
        <table class="table table-responsive table-striped">
            <tr ng-repeat="machine in vm.machines">
                <td> {{ machine.name }}</td>
            </tr>
        </table>
    </div>

显示包含机器名称的表。

3 个答案:

答案 0 :(得分:2)

你可以激活这两种方式:

首先:$broadcast$on

//PUBLISHER
angular.module('myApp').controller('CtrlPublish', ['$rootScope', '$scope',
function ($rootScope, $scope) {

  $rootScope.$broadcast('topic', 'message');

}]);

//SUBSCRIBER
angular.module('myApp').controller('ctrlSubscribe', ['$scope',
function ($scope) {

  var unbind = $scope.$on('topic', function (event, arg) { 
    $scope.receiver = 'got your ' + arg;
  });
  $scope.$on('$destroy', unbind);
}]);

第二:通过共同服务

angular.module('myApp', [], function($provide) {
    $provide.factory('msgBus', ['$rootScope', function($rootScope) {
        var msgBus = {};
        msgBus.emitMsg = function(msg) {
        $rootScope.$emit(msg);
        };
        msgBus.onMsg = function(msg, scope, func) {
            var unbind = $rootScope.$on(msg, func);
            scope.$on('$destroy', unbind);
        };
        return msgBus;
    }]);
});

并在控制器中使用它:

控制器1

function($scope, msgBus) {
    $scope.sendmsg = function() {
        msgBus.emitMsg('somemsg')
    }
}

控制器2

function($scope, msgBus) {
    msgBus.onMsg('somemsg', $scope, function() {
        // your logic
    });
}

来自:Post

答案 1 :(得分:1)

为什么不创建服务而不是第二个控制器并将其注入主控制器并使用它。

可能你可以参考:

http://ilikekillnerds.com/2014/11/angularjs-call-controller-another-controller/

答案 2 :(得分:1)

要负责下载数据,您应该使用工厂。

请查看this answer,了解有关良好做法的更多详情。

我修改了你的代码以使用工厂。

angular.module("app-machines", ['ngFlatDatepicker'])
    .factory('MachinesService', ['$http', MachinesService])
    .controller('mainController', ['$scope', 'MachinesService', mainController]);

function mainController($scope, MachinesService) {
    // date pickers config...

    $scope.date_from = "14.09.2015";
    $scope.date_to = "15.09.2015";

    $scope.change = function () {
        MachinesService.getMachines($scope.date_from, $scope.date_to).then(function (response) {
            vm.machines = response.data;
        }, function (error) {
            vm.errorMessage = "Failed to load data:" + error;
        });
    };

}

function MachinesService($http) {
    return {
        getMachines: getMachines
    };

    function getMachines(from, to) {
        return $http.get("/api/machine/" + from + "_" + to);
    }
}