Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Angularjs如何从另一个控制器调用控制器的函数_Javascript_Angularjs - Fatal编程技术网

Javascript Angularjs如何从另一个控制器调用控制器的函数

Javascript Angularjs如何从另一个控制器调用控制器的函数,javascript,angularjs,Javascript,Angularjs,我正在尝试拆分一个大控制器。方法是通过工厂,但由于我正在更改DOM,所以应该通过控制器来完成 然后,我试图实现的是从Cntrl1调用Cntrl2中定义的函数。 榜样 html 演示 我希望将工厂的“var x”定义为Cntrl2的函数,然后在我从Cntrl1调用工厂时通过工厂执行此函数 那么,如何使这项工作?这种方法正确吗?或者我应该从工厂更改DOM吗 干杯, Gerard不知道Cntrl2和Cntrl1的关系在哪里,我会使用类似的发射或广播。根据过去的经验,我认为在同一页面中使用两个或多个不同

我正在尝试拆分一个大控制器。方法是通过工厂,但由于我正在更改DOM,所以应该通过控制器来完成

然后,我试图实现的是从Cntrl1调用Cntrl2中定义的函数。 榜样

html

演示

我希望将工厂的“var x”定义为Cntrl2的函数,然后在我从Cntrl1调用工厂时通过工厂执行此函数

那么,如何使这项工作?这种方法正确吗?或者我应该从工厂更改DOM吗

干杯,
Gerard不知道Cntrl2和Cntrl1的关系在哪里,我会使用类似的发射或广播。根据过去的经验,我认为在同一页面中使用两个或多个不同的模块不是一个好主意

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

angular.module('app').controller('Cntrl1', 
['$scope', '$q', '$timeout', 'myFactory', 
function ($scope, $q, $timeout, myFactory) {
    $scope.$emit('messageEvt','started');
    myFactory.process().then(function() {
        $scope.$emit('messageEvt','ended');
    });
}]);

angular.module('app').controller('Cntrl2', 
['$scope', '$q', '$timeout', $rootScope, 
function ($scope, $q, $timeout, $rootScope) {
    $rootScope.$on('messageEvt',function(e,msg) {
        $scope.message = msg;
    }
}]);

angular.module('app').factory('myFactory', 
['$window', '$q','$timeout',
function($window, $q,$timeout) {
    var x;
    return {
        process: function() {
            var deferObj = $q.defer();
            $timeout(function() {
                deferObj.resolve(x);
            });
            return deferObj.promise;
        },
    };
}]);

我认为更好的方法是让工厂维护模型,两个控制器在需要时更新模型

我把小提琴改成


如果我理解错了,请告诉我。

我认为你将工厂命名为“共享范围”。工厂不是范围。但是你是对的,与控制器通信的一个好方法是通过工厂。我已经意识到在工厂中生成html代码是可以的,只是代码应该插入到控制器的DOM中,而不是工厂中。如果这是正确的,那么我将使用一个控制器来操纵DOM和工厂来构造hmtl,然后应该添加hmtl(然后问题就无关紧要了)
var myModule = angular.module('app', []);

angular.module('app').controller('Cntrl1', 
['$scope', '$q', '$timeout', 'Share_scope', 
function ($scope, $q, $timeout, Share_scope) {
    Share_scope.process();
    $scope.message = 'started';
}]);

angular.module('app').controller('Cntrl2', 
['$scope', '$q', '$timeout', 'Share_scope', 
function ($scope, $q, $timeout, Share_scope) {
    Share_scope.x = function() {
           alert('done');
    }
}]);

angular.module('app').factory('Share_scope', 
['$window', '$q',
function($window, $q) {
    var x;
    return {
        process: function() {
            return x;
        },
    };
}]);
var myModule = angular.module('app', []);

angular.module('app').controller('Cntrl1', 
['$scope', '$q', '$timeout', 'myFactory', 
function ($scope, $q, $timeout, myFactory) {
    $scope.$emit('messageEvt','started');
    myFactory.process().then(function() {
        $scope.$emit('messageEvt','ended');
    });
}]);

angular.module('app').controller('Cntrl2', 
['$scope', '$q', '$timeout', $rootScope, 
function ($scope, $q, $timeout, $rootScope) {
    $rootScope.$on('messageEvt',function(e,msg) {
        $scope.message = msg;
    }
}]);

angular.module('app').factory('myFactory', 
['$window', '$q','$timeout',
function($window, $q,$timeout) {
    var x;
    return {
        process: function() {
            var deferObj = $q.defer();
            $timeout(function() {
                deferObj.resolve(x);
            });
            return deferObj.promise;
        },
    };
}]);
angular.module('app').factory('Share_scope', 
['$window', '$q',
function($window, $q) {
    var x;

    return {
        getProcess: function() {
            return x;
        },
        setProcess: function(value){
           x = value;
        }
    };
}]);