如何在页面加载时执行AngularJS控制器功能?

时间:2013-03-17 07:43:56

标签: angularjs onload

目前我有一个Angular.js页面,允许搜索和显示结果。用户单击搜索结果,然后单击后退按钮。我希望再次显示搜索结果,但我无法确定如何触发搜索执行。这是详细信息:

  • 我的Angular.js页面是一个搜索页面,带有搜索字段和搜索 按钮。用户可以手动输入查询并按下按钮 并触发ajax查询并显示结果。我用搜索词更新了URL。一切正常。
  • 用户点击搜索结果并转到其他页面 - 这也可以正常工作。
  • 用户点击后退按钮,返回我的角度搜索页面,显示正确的URL,包括搜索词。一切正常。
  • 我已将搜索字段值绑定到网址中的搜索字词,因此它包含预期的搜索字词。一切正常。

如果用户不必按“搜索按钮”,如何让搜索功能再次执行?如果它是jquery,那么我将在documentready函数中执行一个函数。我看不到Angular.js的等价物。

14 个答案:

答案 0 :(得分:419)

一方面,@ 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
};

但要注意angular documentation implies (since v1.2),不要使用ng-init。但是,这取决于你的应用程序的架构。

当我想将值从后端传递到angular app时,我使用了ng-init

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

答案 1 :(得分:133)

试试这个?

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

答案 2 :(得分:59)

我永远无法让$viewContentLoaded为我工作,ng-init应该只用在ng-repeat中(根据文档),并且直接在一个函数中调用函数如果代码依赖于尚未定义的元素,则控制器可能会导致错误。

这就是我的工作,它对我有用:

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

除非您使用ui-router。然后是:

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

答案 3 :(得分:42)

card.xml

答案 4 :(得分:29)

Dimitri / Mark的解决方案对我不起作用,但使用$timeout函数似乎可以很好地确保代码仅在呈现标记后运行。

# Your controller, including $timeout

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

$timeout($scope.init)

希望它有所帮助。

答案 5 :(得分:26)

如果要监视viewContentLoaded DOM对象以进行更改然后执行某些操作,则可以执行此操作。使用$ scope。$ on也可以,但不同,特别是当你的路由有一个页面模式时。

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

答案 6 :(得分:19)

您可以使用angular的$ window窗口对象:

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

答案 7 :(得分:4)

另一种选择:

var myInit = function () {
    //...
};
angular.element(document).ready(myInit);

(通过https://stackoverflow.com/a/30258904/148412

答案 8 :(得分: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
 }
}

答案 9 :(得分:3)

如果你有一个特定于该页面的控制器,还有另一种选择:

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

答案 10 :(得分:3)

发现Dmitry Evseev的回答非常有用。

案例1:单独使用angularJs:
要在页面加载时执行方法,您可以在视图中使用ng-init并在控制器中声明init方法,并且根据angular Docs on ng-init表示不建议使用较重的函数:

  

可以滥用此指令将不必要的逻辑量添加到模板中。 ngInit只有少数适​​当的用途,例如用于别名ngRepeat的特殊属性,如下面的演示所示;并通过服务器端脚本注入数据。除了这几种情况,您应该使用控制器而不是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'
  })

希望这有帮助

答案 11 :(得分:3)

我遇到了同样的问题,只有这个解决方案适用于我(它在加载完整的DOM后运行一个函数)。我在加载页面后使用它来滚动到锚点:

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

                        // Your function that runs after all DOM is loaded

                    });

答案 12 :(得分:2)

您可以将搜索结果保存在一个可以在任何地方使用但在导航到另一个页面时不会清除的公共服务中,然后您可以使用保存的数据设置搜索结果以单击后退按钮

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

对于你的后退按钮

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

答案 13 :(得分:0)

在自初始化函数中调用初始方法。

(function initController() {

    // do your initialize here

})();