現在、私は検索と結果の表示を可能にするAngular.jsページを持っています。ユーザーが検索結果をクリックしてから戻るボタンをクリックします。検索結果をもう一度表示したいのですが、検索を実行する方法がわかりません。詳細はこちら:
ユーザーが「検索ボタン」を押さなくても検索機能を再度実行するにはどうすればよいですか?それがjqueryだったなら、私はdocumentready関数の中の関数を実行するでしょう。 Angular.jsに相当するものが見当たりません。
一方で@ 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
を使用しないでください。しかし、それはあなたのアプリのアーキテクチャによって異なります。
バックエンドからAngularアプリに値を渡したいときは、ng-init
を使用しました。
<div data-ng-controller="myCtrl" data-ng-init="init('%some_backend_value%')"></div>
これを試して?
$scope.$on('$viewContentLoaded', function() {
//call it here
});
$viewContentLoaded
をうまく動かすことはできませんでしたし、ng-init
は実際にはng-repeat
でしか使われるべきではありませんでした。まだ定義されています。
これは私がすることであり、それは私のために働きます:
$scope.$on('$routeChangeSuccess', function () {
// do something
});
ui-router
を使用していない限り。それはそれです:
$scope.$on('$stateChangeSuccess', function () {
// do something
});
angular.element(document).ready(function () {
// your code here
});
Dimitriの/ Markの解決策は私にはうまくいきませんでしたが、 $ timeout 関数を使うことはあなたのコードがマークアップがレンダリングされた後にのみ実行されることを保証するためにうまくいくようです。
# Your controller, including $timeout
var $scope.init = function(){
//your code
}
$timeout($scope.init)
それが役に立てば幸い。
ViewContentLoaded DOMオブジェクトを変更して何かをしたいのなら、これを行うことができます。 $ scope。$ onを使用しても動作しますが、特にルーティングに1ページモードがある場合は動作が異なります。
$scope.$watch('$viewContentLoaded', function(){
// do something
});
角度付きの$ windowオブジェクトを使うことができます。
$window.onload = function(e) {
//your magic here
}
もう一つの選択肢:
var myInit = function () {
//...
};
angular.element(document).ready(myInit);
$ routeProviderを使用すると、.stateで解決してサービスをブートストラップできます。これは、サービスを解決した後にのみ、Controller and 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
}
}
私は同じ問題を抱えていて、この解決策だけが私のために働きました(それは完全なDOMがロードされた後に機能を実行します)。私はページがロードされた後にアンカーするためにスクロールにこれを使います:
angular.element(window.document.body).ready(function () {
// Your function that runs after all DOM is loaded
});
そのページ専用のコントローラがある場合は、さらに別の方法があります。
(function(){
//code to run
}());
Dmitry Evseevの回答は非常に便利です。
ケース1:angleJsのみを使用する場合:
ページのロード時にメソッドを実行するには、ビューでng-init
を使用し、コントローラーでinitメソッドを宣言できます。これは、 angular 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'
})
お役に立てれば
あなたはどこからでも使用することができ、別のページに移動したときにはっきりしない共通のサービスに検索結果を保存することができます。そして、戻るボタンをクリックするための保存データで検索結果を設定できます。
function search(searchTerm) {
// retrieve the data here;
RetrievedData = CallService();
CommonFunctionalityService.saveSerachResults(RetrievedData);
}
あなたのバックボタン用
function Backbutton() {
RetrievedData = CommonFunctionalityService.retrieveResults();
}
自己初期化関数内で初期メソッドを呼び出す。
(function initController() {
// do your initialize here
})();