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

Duk*_*gal 355 onload angularjs

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

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

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

Dmi*_*eev 425

一方面,正如@ 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();
Run Code Online (Sandbox Code Playgroud)

您还可以查看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
};
Run Code Online (Sandbox Code Playgroud)

但要注意它,因为角度文档暗示(因为v1.2)不使用ng-init它.但是,它取决于您的应用程序的架构.

ng-init当我想将值从后端传递到角度应用程序时,我使用了:

<div data-ng-controller="myCtrl" data-ng-init="init('%some_backend_value%')"></div>
Run Code Online (Sandbox Code Playgroud)

  • 虽然这个解决方案有效,但由于ng-init文档对此提出了建议,因此我投了反对意见.具体来说,"ngInit的唯一合适用途是对ngRepeat的特殊属性进行别名化,如下面的演示所示.除了这种情况,你应该使用控制器而不是ngInit来初始化作用域上的值." (24认同)
  • @Duke,您不能只将init()函数的内容放在控制器的底部吗?即,为什么需要使用ng-init并具有init()函数?当用户点击后退按钮时,我假设你正在切换视图,因此创建并执行一个新的`myCtrl`控制器. (6认同)
  • 如果控制器在其他页面中重复使用但您只想在特定页面上触发它会怎么样? (3认同)
  • @RobertoLinares我个人发现指令是可重用功能的更好地方.你可以有一个带有init参数的指令:`<div smth on-init ="doWhatever()">`.当然这取决于某个用例. (3认同)

hol*_*ple 136

试试这个?

$scope.$on('$viewContentLoaded', function() {
    //call it here
});
Run Code Online (Sandbox Code Playgroud)

  • 用例是不同的.我也一直使用Mark的方法. (7认同)
  • 感谢您的回复,但德米特里的回答与我正在寻找的完全匹配.进一步的研究似乎建议不要使用$ viewContentLoaded (5认同)

ada*_*101 59

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

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

$scope.$on('$routeChangeSuccess', function () {
  // do something
});
Run Code Online (Sandbox Code Playgroud)

除非你正在使用ui-router.那就是:

$scope.$on('$stateChangeSuccess', function () {
  // do something
});
Run Code Online (Sandbox Code Playgroud)

  • $ scope。$ on('$ routeChangeSuccess'`会在每次更改url中的参数时触发(例如,通过`$ location`),因此,您只能使用$ scope。$ on('$ locationChangeSuccess'.。在页面加载/重新加载时需要一些触发器,可以按照此处的建议使用$ scope。$ watch('$ viewContentLoaded'`。在更改网址参数期间不会触发。 (2认同)

小智 42

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

    // your code here

});
Run Code Online (Sandbox Code Playgroud)

  • 必须是接受的答案,这是更安全的方式 (4认同)
  • 解释将不胜感激 (4认同)

小智 30

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

# Your controller, including $timeout

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

$timeout($scope.init)
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.

  • 最后.这是唯一一个对我有用的人.谢谢. (3认同)

Cod*_*ide 27

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

 $scope.$watch('$viewContentLoaded', function(){
    // do something
 });
Run Code Online (Sandbox Code Playgroud)

  • 具体来说,如果你使用$ rootScope.$ watch而不是$ rootScope.$ on就不会触发路由更改,因此你可以使用特定于初始页面加载的逻辑. (7认同)

mcg*_*raw 19

你可以使用angular的$ window对象:

$window.onload = function(e) {
  //your magic here
}
Run Code Online (Sandbox Code Playgroud)