簡體   English   中英

AngularJS如何從另一個控制器調用一個控制器的功能

[英]Angularjs how to call a function of a controller from another controller

我正在嘗試拆分一個大控制器。 可以通過工廠進行操作,但是由於我要更改DOM,因此應該通過控制器來完成。

然后,我要實現的是從Cntrl1調用Cntrl2中定義的函數。 這個例子

HTML

<body ng-app="app">
<div ng-controller='Cntrl1'>
{{message}}
</div>
</body>

JS

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;
        },
    };
}]);

演示http://jsfiddle.net/T8rgv/7/

我希望將工廠的“ var x”定義為Cntrl2的函數,然后在我從Cntrl1調用它時通過工廠執行此函數。

那么,如何使這項工作呢? 這種方法正確嗎? 還是應該只從工廠更改DOM?

干杯,傑拉德

不知道在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;
        },
    };
}]);

我認為更好的方法是讓工廠維護模型,並由兩個控制器在需要時進行更新。

我將小提琴更新為http://jsfiddle.net/hh5Cy/2/

angular.module('app').factory('Share_scope', 
['$window', '$q',
function($window, $q) {
    var x;

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

如果我對你的理解有誤,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM