Sudah ditanyakan sebelumnya, dan dari jawaban itu tidak terlihat bagus. Saya ingin bertanya dengan kode sampel ini sebagai pertimbangan ...
Aplikasi saya memuat item saat ini di layanan yang menyediakannya. Ada beberapa pengontrol yang memanipulasi data item tanpa item dimuat ulang.
Pengontrol saya akan memuat ulang item jika belum disetel, jika tidak, ia akan menggunakan item yang saat ini dimuat dari layanan, antara pengontrol.
Masalah : Saya ingin menggunakan jalur berbeda untuk setiap pengontrol tanpa memuat ulang Item.html.
1) Apakah itu mungkin?
2) Jika itu tidak mungkin, apakah ada pendekatan yang lebih baik untuk memiliki path per controller vs apa yang saya temukan di sini?
app.js
var app = angular.module('myModule', []).
config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/items', {templateUrl: 'partials/items.html', controller: ItemsCtrl}).
when('/items/:itemId/foo', {templateUrl: 'partials/item.html', controller: ItemFooCtrl}).
when('/items/:itemId/bar', {templateUrl: 'partials/item.html', controller: ItemBarCtrl}).
otherwise({redirectTo: '/items'});
}]);
Item.html
<!-- Menu -->
<a id="fooTab" my-active-directive="view.name" href="#/item/{{item.id}}/foo">Foo</a>
<a id="barTab" my-active-directive="view.name" href="#/item/{{item.id}}/bar">Bar</a>
<!-- Content -->
<div class="content" ng-include="" src="view.template"></div>
controller.js
// Helper function to load $scope.item if refresh or directly linked
function itemCtrlInit($scope, $routeParams, MyService) {
$scope.item = MyService.currentItem;
if (!$scope.item) {
MyService.currentItem = MyService.get({itemId: $routeParams.itemId});
$scope.item = MyService.currentItem;
}
}
function itemFooCtrl($scope, $routeParams, MyService) {
$scope.view = {name: 'foo', template: 'partials/itemFoo.html'};
itemCtrlInit($scope, $routeParams, MyService);
}
function itemBarCtrl($scope, $routeParams, MyService) {
$scope.view = {name: 'bar', template: 'partials/itemBar.html'};
itemCtrlInit($scope, $routeParams, MyService);
}
Resolusi.
Status : Menggunakan kueri penelusuran seperti yang disarankan dalam jawaban yang diterima memungkinkan saya memberikan url yang berbeda tanpa memuat ulang pengontrol utama.
app.js
var app = angular.module('myModule', []).
config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/items', {templateUrl: 'partials/items.html', controller: ItemsCtrl}).
when('/item/:itemId/', {templateUrl: 'partials/item.html', controller: ItemCtrl, reloadOnSearch: false}).
otherwise({redirectTo: '/items'});
}]);
Item.html
<!-- Menu -->
<dd id="fooTab" item-tab="view.name" ng-click="view = views.foo;"><a href="#/item/{{item.id}}/?view=foo">Foo</a></dd>
<dd id="barTab" item-tab="view.name" ng-click="view = views.bar;"><a href="#/item/{{item.id}}/?view=foo">Bar</a></dd>
<!-- Content -->
<div class="content" ng-include="" src="view.template"></div>
controller.js
function ItemCtrl($scope, $routeParams, Appts) {
$scope.views = {
foo: {name: 'foo', template: 'partials/itemFoo.html'},
bar: {name: 'bar', template: 'partials/itemBar.html'},
}
$scope.view = $scope.views[$routeParams.view];
}
directives.js
app.directive('itemTab', function(){
return function(scope, elem, attrs) {
scope.$watch(attrs.itemTab, function(val) {
if (val+'Tab' == attrs.id) {
elem.addClass('active');
} else {
elem.removeClass('active');
}
});
}
});
Konten di dalam parsial saya dibungkus dengan ng-controller=...
Jawaban:
Jika Anda tidak harus menggunakan URL seperti
#/item/{{item.id}}/foo
dan#/item/{{item.id}}/bar
tapi#/item/{{item.id}}/?foo
dan#/item/{{item.id}}/?bar
sebagai gantinya, Anda dapat mengatur rute Anda untuk/item/{{item.id}}/
memilikireloadOnSearch
set kefalse
( https://docs.angularjs.org/api/ngRoute/provider/$routeProvider ). Itu memberitahu AngularJS untuk tidak memuat ulang tampilan jika bagian pencarian dari url berubah.sumber
ng-controller="view.controller"
keng-include
direktif.<div ng-controller="itemFooCtrl">... your template content...</div>
. EDIT: Senang melihat Anda terselesaikan, alangkah baiknya jika Anda memperbarui pertanyaan Anda dengan cara Anda menyelesaikannya, mungkin dengan jsFiddle.Jika Anda perlu mengubah path, tambahkan ini setelah .config Anda di file aplikasi Anda. Maka Anda bisa lakukan
$location.path('/sampleurl', false);
untuk mencegah reloadKredit pergi ke https://www.consolelog.io/angularjs-change-path-without-reloading untuk solusi paling elegan yang saya temukan.
sumber
$timeout(un, 200);
sebelum pernyataan pengembalian karena kadang$locationChangeSuccess
- kadang tidak menyala sama sekaliapply
(dan rute tidak berubah ketika benar-benar diperlukan). Solusi saya membersihkan semuanya setelah doa path (..., false)mengapa tidak hanya menempatkan ng-controller satu tingkat lebih tinggi,
Dan jangan mengatur pengontrol di rute,
ini bekerja untuk saya.
sumber
Bagi yang membutuhkan path () ubah tanpa reload controller - Berikut ini plugin: https://github.com/anglibs/angular-location-update
Pemakaian:
Berdasarkan https://stackoverflow.com/a/24102139/1751321
PS Solusi ini https://stackoverflow.com/a/24102139/1751321 berisi bug setelah path (, false) dipanggil - ia akan memecah navigasi browser maju / mundur hingga path (, true) dipanggil
sumber
Meskipun posting ini sudah tua dan sudah mendapat jawaban, menggunakan reloadOnSeach = false tidak menyelesaikan masalah bagi kita yang perlu mengubah jalur aktual dan bukan hanya params. Inilah solusi sederhana untuk dipertimbangkan:
Gunakan ng-include daripada ng-view dan tetapkan controller Anda di templat.
Hanya sisi buruknya adalah Anda tidak dapat menggunakan atribut resolusinya, tapi itu cukup mudah untuk dilakukan. Anda juga harus mengelola keadaan controller, seperti logika berdasarkan $ routeParams ketika rute berubah dalam controller sebagai perubahan url yang sesuai.
Berikut ini contohnya: http://plnkr.co/edit/WtAOm59CFcjafMmxBVOP?p=preview
sumber
Saya menggunakan solusi ini
Pendekatan ini mempertahankan fungsi tombol kembali, dan Anda selalu memiliki routeParams saat ini di templat, tidak seperti beberapa pendekatan lain yang pernah saya lihat.
sumber
Jawaban di atas, termasuk yang GitHub, memiliki beberapa masalah untuk skenario saya dan juga tombol kembali atau perubahan url langsung dari browser memuat ulang controller, yang saya tidak suka. Saya akhirnya pergi dengan pendekatan berikut:
1. Tetapkan properti dalam definisi rute, yang disebut 'noReload' untuk rute-rute di mana Anda tidak ingin controller memuat ulang pada perubahan rute.
2. Dalam menjalankan fungsi modul Anda, masukkan logika yang memeriksa rute-rute tersebut. Ini akan mencegah isi ulang hanya jika
noReload
adalahtrue
dan pengendali rute sebelumnya adalah sama.3. Terakhir, di controller, dengarkan acara $ routeUpdate sehingga Anda dapat melakukan apa pun yang perlu Anda lakukan ketika parameter rute berubah.
Ingatlah bahwa dengan pendekatan ini, Anda tidak mengubah hal-hal di controller dan kemudian memperbarui jalur yang sesuai. Itu sebaliknya. Anda pertama-tama mengubah jalur, kemudian mendengarkan acara $ routeUpdate untuk mengubah hal-hal di controller ketika parameter rute berubah.
Ini menjaga hal-hal sederhana dan konsisten karena Anda dapat menggunakan logika yang sama baik ketika Anda hanya mengubah path (tetapi tanpa permintaan $ http mahal jika Anda suka) dan ketika Anda benar-benar memuat ulang browser.
sumber
Ada cara sederhana untuk mengubah jalur tanpa memuat ulang
Gunakan kode ini untuk mengubah URL, Halaman tidak akan dialihkan
Parameter kedua "false" sangat penting.
sumber
Inilah solusi lengkap saya yang memecahkan beberapa hal yang dilewatkan @Vigrond dan @rahilwazir:
$routeUpdate
.$locationChangeSuccess
tidak pernah dipicu yang menyebabkan pembaruan rute berikutnya dicegah.Jika dalam siklus intisari yang sama ada permintaan pembaruan lain, kali ini yang ingin memuat ulang, pengendali acara akan membatalkan memuat ulang itu.
sumber
path
pada akhirnya seharusnyaparam
, juga ini tidak bekerja dengan hash, dan url di bilah alamat saya tidak diperbaruiTambahkan tag kepala bagian dalam berikut
Ini akan mencegah memuat ulang.
sumber
Sejak sekitar versi 1.2, Anda dapat menggunakan $ location.replace () :
sumber