페이지로드시 AngularJS 컨트롤러 기능을 실행하는 방법은 무엇입니까?


359

현재 Angular.js 페이지를 검색하고 결과를 표시 할 수 있습니다. 사용자는 검색 결과를 클릭 한 다음 뒤로 버튼을 클릭합니다. 검색 결과를 다시 표시하고 싶지만 검색을 실행하는 방법을 알아낼 수 없습니다. 세부 사항은 다음과 같습니다.

  • My Angular.js 페이지는 검색 필드와 검색 버튼이있는 검색 페이지입니다. 사용자는 쿼리를 수동으로 입력하고 버튼을 누르면 Ajax 쿼리가 시작되고 결과가 표시됩니다. 검색어로 URL을 업데이트합니다. 모든 것이 잘 작동합니다.
  • 사용자가 검색 결과를 클릭하면 다른 페이지로 이동합니다.
  • 사용자가 뒤로 버튼을 클릭하고 내 각도 검색 페이지로 돌아 가면 검색어를 포함한 올바른 URL이 표시됩니다. 모두 잘 작동합니다.
  • 검색 필드 값을 URL의 검색어에 바인딩 했으므로 예상 검색어가 포함됩니다. 모두 잘 작동합니다.

사용자가 "검색 버튼"을 누르지 않아도 검색 기능을 다시 실행하려면 어떻게해야합니까? jquery 인 경우 documentready 함수에서 함수를 실행합니다. Angular.js에 해당하는 것을 볼 수 없습니다.


당신은 사용하고 $routepProvider있습니까? 검색 결과에 대한 데이터를 제공하는 앱에서 서비스에 연결하는 데 사용하십시오. document.readyjQuery와 같은 용어로 생각하지 마십시오 . 현재 유선 검색 방법을 찾지 않고 많은 도움을
받기가 어렵

답변:


430

한편으로 @ Mark-Rajcok은 개인 내부 기능으로 도망 갈 수 있다고 말했습니다.

// at the bottom of your controller
var init = function () {
   // check if there is query in url
   // and fire search in case its value is not empty
};
// and fire it after definition
init();

또한 ng-init 지시문을 살펴볼 수 있습니다 . 구현은 다음과 같습니다.

// register controller in html
<div data-ng-controller="myCtrl" data-ng-init="init()"></div>

// in controller
$scope.init = function () {
    // check if there is query in url
    // and fire search in case its value is not empty
};

그러나 각도 문서는 (v1.2 이후) 사용하지 않기 때문에 주의하십시오 ng-init. 그러나 imo는 앱의 아키텍처에 따라 다릅니다.

ng-init백엔드에서 각도 앱으로 값을 전달하려고 할 때 사용했습니다 .

<div data-ng-controller="myCtrl" data-ng-init="init('%some_backend_value%')"></div>

6
@ 듀크, 컨트롤러 하단에 init () 함수의 내용을 넣을 수는 없습니까? 즉, 왜 ng-init를 사용해야하고 init () 함수가 필요합니까? 사용자가 뒤로 버튼을 누르면 뷰를 전환한다고 가정하므로 새 myCtrl컨트롤러가 생성되어 실행됩니다.
Mark Rajcok

24
이 솔루션이 작동하는 동안 ng-init 설명서가 이에 대해 조언하기 때문에 하향 조정되었습니다. 특히, "아래 데모에서 볼 수 있듯이 ngRepeat의 특수 속성을 앨리어싱하기 위해 ngInit을 사용하는 유일한 방법입니다.이 경우 ngInit가 아닌 컨트롤러를 사용하여 범위의 값을 초기화해야합니다."
Jason Capriotti

1
html이 제자리에 있으면 컨트롤러가 인스턴스화됩니다.
Dmitry Evseev

3
컨트롤러가 다른 페이지에서 재사용되지만 특정 페이지에서 컨트롤러를 실행하려면 어떻게해야합니까?
Roberto Linares 2018 년

3
@RobertoLinares 개인적으로 지시문이 재사용 가능한 기능을위한 더 나은 장소가 될 것입니다. init 매개 변수를 사용하여 지시문을 가질 수 있습니다 <div smth on-init="doWhatever()">. 물론 특정 사용 사례에 따라 다릅니다.
Dmitry Evseev 2016 년

135

이 시도?

$scope.$on('$viewContentLoaded', function() {
    //call it here
});

5
답장을 보내 주셔서 감사하지만 Dmitry의 답변은 내가 찾고있는 것과 정확히 일치했습니다. 추가 연구는 $ viewContentLoaded
Duke Dougal

7
사용 사례는 다릅니다. Mark의 방법도 항상 사용합니다.
홀로그램 원리

내 유스 케이스의 경우 이것은 완벽한 솔루션이었습니다. 사용자가 텍스트를 복사하도록하려면 텍스트를 자동 선택해야했습니다. 페이지를 여러 번 다시로드 / 다시 방문 할 수 있으므로 $ viewContentLoaded와 정확히 일치합니다. 감사!
Olga Gnatenko

이것이 여러 번 실행될 수 있습니까? 나는 그것을 흉내내는 것으로 보이는 행동을 받고 있습니다 ...
MadPhysicist

1
이것은 나를 위해 작동하지 않았지만 $ scope. $ watch는 효과가있었습니다. 주요 차이점은 무엇입니까?
Burak Tokak

59

나는 $viewContentLoaded나를 위해 일할 수 없었고 ng-init실제로 ng-repeat(문서에 따르면) 에만 사용해야 하며 컨트롤러에서 직접 함수를 호출하면 코드가 아직 정의되지 않은 요소에 의존하는 경우 오류가 발생할 수 있습니다 .

이것이 내가하는 일이며 나를 위해 일합니다.

$scope.$on('$routeChangeSuccess', function () {
  // do something
});

하지 않는 한 당신이 사용하고 ui-router. 그런 다음 :

$scope.$on('$stateChangeSuccess', function () {
  // do something
});

1
당신은 굉장합니다, 내 친구.
taco

정확히 내가 필요한 것. 나는 문자 그대로 이틀 동안 찾고 있었다!
hellojebus

3
$scope.$on('$routeChangeSuccess'url의 매개 변수가 변경 될 때마다 ( $location예 : 통해 ) 실행되므로 그냥 사용할 수 있습니다 $scope.$on('$locationChangeSuccess'. 페이지로드 / 리로드시 트리거가 필요한 경우 $scope.$watch('$viewContentLoaded'여기에 제안 된대로 사용할 수 있습니다. URL 매개 변수 변경 중에는 실행되지 않습니다.
신경 전달 물질

AngularJS와 1.17.2을 사용하여 내부 컨트롤러 $ routeChangeSuccess은 ... 긴 라이브 adam0101 ... 놀라 울 일
ArifMustafa

43
angular.element(document).ready(function () {

    // your code here

});

4
허용 대답이되어야하며,이 할 수있는 안전한 방법입니다
Marwen 트라벨시

우리가 작업하지 않고 $scope대신 작업하는 경우에 this좋습니다.
Akash

어디로 가야합니까? 내 템플릿에 있고 발사되지 않습니다.
Dave

이 경우 $ document를 주입하는 것이 가장 좋지 않을까요? angular.element ($ document) .ready ...
jamie

4
설명 감사합니다
Hidayt Rahman

32

Dimitri 's / Mark의 솔루션이 저에게는 효과가 없었지만 $ timeout 함수를 사용 하면 마크 업이 렌더링 된 후에 만 ​​코드가 실행되도록하는 것이 좋습니다.

# Your controller, including $timeout

var $scope.init = function(){
 //your code
}

$timeout($scope.init)

도움이 되길 바랍니다.


3
드디어. 이것은 나를 위해 일한 유일한 것입니다. 감사.
zmirc

1
작동합니다. 또한 var timer = $ timeout ($ scope.init, milliseconds) 인 $ timeout.cancel (timer)을 사용하여 시간 초과를 지우는 것을 잊지 마십시오. 초기화가 완료되면 또한 $ scope가 위 코드에서 'var'def를 가져야한다고 생각하지 않습니다.
Emmanuel NK

이것이 정답입니다. 그것은 나를 위해 일한 유일한 사람이었습니다 (위의 모든 대답을 시도). iframe 이로 드되기를 기다리는 경우에도 작동합니다.
hello_fr1end

이 작동합니다! viewcontentLoaded는 나를 위해 작동하지 않았다
다크 나이트

28

viewContentLoaded DOM 객체를보고 변경 한 후 수행하려는 경우이 작업을 수행 할 수 있습니다. $ scope. $ on을 사용하면 라우팅에 하나의 페이지 모드가있는 경우 특히 다르게 작동합니다.

 $scope.$watch('$viewContentLoaded', function(){
    // do something
 });

7
특히 $ rootScope. $ on 대신 $ rootScope. $ watch를 사용하면 경로 변경시 실행되지 않으므로 초기 페이지로드에 고유 한 논리를 사용할 수 있습니다.
csahlman

19

각도의 $ window 객체를 사용할 수 있습니다.

$window.onload = function(e) {
  //your magic here
}


3

해당 페이지에만 해당되는 컨트롤러가있는 경우 다른 대안이 있습니다.

(function(){
    //code to run
}());

3

$ routeProvider를 사용하면 .state를 해결하고 서비스를 부트 스트랩 할 수 있습니다. 즉, 서비스를 해결 한 후에 만 ​​Controller 및 View를로드하려고합니다.

UI 라우팅

 .state('nn', {
        url: "/nn",
        templateUrl: "views/home/n.html",
        controller: 'nnCtrl',
        resolve: {
          initialised: function (ourBootstrapService, $q) {

            var deferred = $q.defer();

            ourBootstrapService.init().then(function(initialised) {
              deferred.resolve(initialised);
            });
            return deferred.promise;
          }
        }
      })

서비스

function ourBootstrapService() {

 function init(){ 
    // this is what we need
 }
}

3

Dmitry Evseev의 답변이 매우 유용하다는 것을 알았습니다.

사례 1 : angularJs 단독 사용 :
페이지로드에서 메소드를 실행하려면 ng-init컨트롤러에서보기 및 init 메소드를 선언 할 수 있습니다 .ng -init각도 문서에 따라 더 무거운 함수를 사용하지 않는 것이 좋습니다 .

이 지시문은 남은 템플릿에 불필요한 양의 논리를 추가하기 위해 남용 될 수 있습니다. 아래 데모에서 볼 수 있듯이 ngRepeat의 특수 속성 앨리어싱과 같이 ngInit의 적절한 용도는 몇 가지뿐입니다. 서버 측 스크립팅을 통해 데이터를 주입합니다. 이러한 몇 가지 경우 외에 ngInit 대신 컨트롤러를 사용하여 범위의 값을 초기화해야합니다.

HTML :

<div ng-controller="searchController()">
    <!-- renaming view code here, including the search box and the buttons -->
</div>

제어 장치:

app.controller('SearchCtrl', function(){

    var doSearch = function(keyword){
        //Search code here
    }

    doSearch($routeParams.searchKeyword);
})

경고 : 이 컨트롤러를 다른 의도로 사용하여 다른 방법으로 검색 방법을 실행할 수도 있으므로 다른 컨트롤러를 사용하지 마십시오.

사례 2 : Ionic 사용 :
위 코드는 작동합니다.보기 캐시가 다음 route.js과 같이 비활성화되어 있는지 확인하십시오 .

route.js

.state('app', {
    url           : '/search',
    cache         : false, //disable caching of the view here
    templateUrl   : 'templates/search.html'   ,
    controller    : 'SearchCtrl'
  })

도움이 되었기를 바랍니다


1
이것은 단지 하나를 가지고 있었고, 맨 아래에 있었다, 내가 줄곧 갔다, 다행이었다 cache: false– 고맙다!
라니 키어

3

나는 같은 문제가 있었고이 솔루션 만 나를 위해 일했다 (완전한 DOM 이로 드 된 후에 함수를 실행한다). 페이지가로드 된 후 앵커로 스크롤하기 위해 이것을 사용합니다.

angular.element(window.document.body).ready(function () {

                        // Your function that runs after all DOM is loaded

                    });

2

어디에서나 사용할 수있는 공통 서비스에 검색 결과를 저장할 수 있으며 다른 페이지로 이동할 때 지워지지 않으며 뒤로 버튼을 클릭하기 위해 저장된 데이터로 검색 결과를 설정할 수 있습니다

function search(searchTerm) {
    // retrieve the data here;
    RetrievedData = CallService();
    CommonFunctionalityService.saveSerachResults(RetrievedData);
} 

백 버튼

function Backbutton() {
    RetrievedData = CommonFunctionalityService.retrieveResults();
}

0

자체 초기화 함수 내에서 초기 메소드를 호출하십시오.

(function initController() {

    // do your initialize here

})();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.