目前我有一个Angular.js页面,允许搜索和显示结果。用户单击搜索结果,然后单击后退按钮。我希望再次显示搜索结果,但我无法确定如何触发搜索执行。这是详细信息:
如果用户不必按“搜索按钮”,如何让搜索功能再次执行?如果它是jquery,那么我将在documentready函数中执行一个函数。我看不到Angular.js的等价物。
答案 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);
答案 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
})();