2014-10-30 2 views
0

У меня есть два контроллера, как показано ниже. Я хочу использовать первые методы/переменный контроллера в другом контроллереAngularJs Как я могу использовать один метод контроллера, переменные в другом контроллере

app.controller("createController", ["$scope", 
function ($scope) 
{ 
    $scope.i = 0; 
    $scope.changeEstimateStatus = function() 
    { 
    console.log('changeEstimateStatus'); 
    }; 
}]); 


app.controller("editController", ["$scope", 
function ($scope) 
{ 
    //here how can I access 'i' variable of createController 
}]); 
+0

Как связаны контроллеры? Родитель/ребенок - отдельные страницы? Дайте больше информации! \ – tymeJV

+2

похоже на место для использования службы, которая имеет переменную i, а затем вводит ее в контроллеры. – user2717954

+1

Отдельные страницы. Предположим, что без использования $ rootScope –

ответ

3

Используйте общую службу:

app.service("mySharedService", [function() { 
    var _x = null; 

    return { 
     setX: function(val) { _x = val }, 
     getX: function() { return _x } 
    } 
}]); 

Затем вводят в контроллер:

app.controller("createController", ["$scope","mySharedService", function($scope, mySharedService) { 

    $scope.i = mySharedService.getX(); //get 
    mySharedService.setX(3); //set 
}]); 
+0

Thnx alot для вашей важной информации. Если у меня есть больше методов и переменных, пожалуйста, предложите любое другое решение ... –

0

использование один из этого:

1.you можно использовать serveice и поставить общую функцию к этой службе и доступу, которые функционируют на всех controlller.

app.service('MyService', function() { 
    this.changeEstimateStatus = function() 
     { 
     console.log('changeEstimateStatus'); 
     }; 
}); 

    app.controller("createController", ["$scope",MyService, 
    function ($scope,MyService) 
    { 
     $scope.i = 0; 
    MyService.changeEstimateStatus(); 
    }]); 


    app.controller("editController", ["$scope", app.controller("createController", ["$scope",$rootScope, 
    function ($scope,$rootScope) 
    { 
     $scope.i = 0; 
     MyService.changeEstimateStatus(); 

    }]); 

2.you можете сохранить эту функцию в объекте $ cccccp. И затем получить доступ к этой функции ко всем контроллерам.

нравится:

app.controller("createController", ["$scope",$rootScope, 
function ($scope,$rootScope) 
{ 
    $scope.i = 0; 

}]); 


app.controller("editController", ["$scope",$rootScope, 
function ($scope,$rootScope) 
{ 
    $rootScope.changeEstimateStatus(); 
}]); 

, но второй вариант не является хорошим Подход.

+0

Я согласен с использованием службы. Было бы неплохо узнать, почему. На мой взгляд, лучше использовать услугу, потому что тогда вам нужно явно импортировать эту зависимость там, где она вам нужна. Если вы используете корневую область, этот метод будет доступен везде. – BenCr

+1

@BenCr. Служба всегда является правильным местом для размещения кода, который должен быть общим для нескольких контроллеров, что именно требуется OP. $ rootScope следует избегать, когда это возможно, потому что он поделился с КАЖДОЙ частью приложения, в то время как услугу можно вводить только там, где это необходимо. – Blazemonger

+0

Разве это не совсем то, что я сказал? То, что я делал, - это просто сказать «это нехороший подход», не сказав кому-то, почему не отвечает за высокое качество ответа SO. – BenCr

0

Вы должны переместить общую функциональность (changeEstimateStatus) в сервис. Вместо одного контроллера, в зависимости от другого, оба контроллера зависят от службы.

app.service('estimateService', function() { 

    this.changeEstimateStatus = function() { 
    console.log('changeEstimateStatus'); 
    }; 

}); 
    app.controller("createController", ["$scope","estimateService", 
function ($scope, estimateService) 
{ 
    $scope.i = 0; 
    $scope.changeEstimateStatus = function() 
    { 
    estimateService.changeEstimateStatus(); //delegate to the service 
    }; 
}]); 


app.controller("editController", ["$scope", "estimateService" 
function ($scope, estimateService) 
{ 
    $scope.changeEstimateStatus = function() 
    { 
    estimateService.changeEstimateStatus(); //delegate to the service 
    }; 
}]); 

Другой вариант - использовать $ rootScope, но использование служб не так хрупко, чтобы их можно было изменить.

Смежные вопросы