Bagaimana saya bisa memanggil fungsi yang didefinisikan di bawah pengontrol dari setiap tempat halaman web (di luar komponen pengontrol)?
Ini berfungsi dengan baik ketika saya menekan tombol "get". Tapi saya perlu menyebutnya dari luar div controller. Logikanya adalah: secara default div saya disembunyikan. Di suatu tempat di menu navigasi saya menekan tombol dan itu akan menunjukkan () div saya dan menjalankan fungsi "get". Bagaimana saya bisa mencapai ini?
Halaman web saya adalah:
<div ng-controller="MyController">
<input type="text" ng-model="data.firstname" required>
<input type='text' ng-model="data.lastname" required>
<form ng-submit="update()"><input type="submit" value="update"></form>
<form ng-submit="get()"><input type="submit" value="get"></form>
</div>
Js saya:
function MyController($scope) {
// default data and structure
$scope.data = {
"firstname" : "Nicolas",
"lastname" : "Cage"
};
$scope.get = function() {
$.ajax({
url: "/php/get_data.php?",
type: "POST",
timeout: 10000, // 10 seconds for getting result, otherwise error.
error:function() { alert("Temporary error. Please try again...");},
complete: function(){ $.unblockUI();},
beforeSend: function(){ $.blockUI()},
success: function(data){
json_answer = eval('(' + data + ')');
if (json_answer){
$scope.$apply(function () {
$scope.data = json_answer;
});
}
}
});
};
$scope.update = function() {
$.ajax({
url: "/php/update_data.php?",
type: "POST",
data: $scope.data,
timeout: 10000, // 10 seconds for getting result, otherwise error.
error:function() { alert("Temporary error. Please try again...");},
complete: function(){ $.unblockUI();},
beforeSend: function(){ $.blockUI()},
success: function(data){ }
});
};
}
get()
MyController dari pengontrol lain?Jawaban:
Berikut adalah cara untuk memanggil fungsi pengontrol dari luarnya:
di mana
get()
fungsi dari controller Anda.Anda bisa beralih
untuk
Jika Anda menggunakan jQuery.
Juga, jika fungsi Anda berarti mengubah apa pun pada Tampilan Anda, Anda harus memanggil
untuk menerapkan perubahan.
Satu hal lagi, Anda harus perhatikan adalah bahwa lingkup diinisialisasi setelah halaman dimuat, jadi metode panggilan dari luar ruang lingkup harus selalu dilakukan setelah halaman dimuat. Lain Anda tidak akan sampai ke ruang lingkup sama sekali.
MEMPERBARUI:
Dengan versi sudut terbaru, sebaiknya Anda gunakan
Dan ya, ini sebenarnya adalah praktik yang buruk , tetapi kadang-kadang Anda hanya perlu melakukan sesuatu dengan cepat dan kotor.
sumber
$apply
bagian untuk bekerja untuk saya, sampai saya membungkus kode menjadi suatu fungsi, misalnya..scope.$apply(function() { scope.get() });
angular.element(document.getElementById('yourControllerElementID')).scope().controller;
For ex. jika digunakan:angular.element(document.getElementById('controller')).scope().get()
kesalahan melempar dan tidak terdefinisi, tetapi jika saya menggunakannyaangular.element(document.getElementById('controller')).scope().controller.get()
berfungsi.scope()
diangular.element(...)
, karena itu kembali tidak terdefinisi dan vardump dari elemen / objek sudut mengatakan bahwa fungsiscope
terletak di dalam__proto__
-object.Saya telah menemukan contoh di internet.
Beberapa orang menulis kode ini dan bekerja dengan sempurna
HTML
JAVASCRIPT
Demo
* Saya melakukan beberapa modifikasi, lihat yang asli: font JSfiddle
sumber
Solusinya
angular.element(document.getElementById('ID')).scope().get()
berhenti bekerja untuk saya di sudut 1.5.2. Sombody menyebutkan dalam komentar bahwa ini tidak bekerja di 1.4.9 juga. Saya memperbaikinya dengan menyimpan lingkup dalam variabel global:panggilan dari kode khusus:
jika Anda ingin membatasi ruang lingkup hanya metode ini. Untuk meminimalkan paparan seluruh ruang lingkup. gunakan teknik berikut.
panggilan dari kode khusus:
sumber
Jawaban Dmitry bekerja dengan baik. Saya baru saja membuat contoh sederhana menggunakan teknik yang sama.
jsfiddle: http://jsfiddle.net/o895a8n8/5/
.
sumber
Saya lebih suka memasukkan pabrik sebagai dependensi pada pengontrol daripada menyuntikkannya dengan baris kode mereka sendiri: http://jsfiddle.net/XqDxG/550/
ControllerZero. $ Inject = ['$ scope', 'mySharedService'];sumber
Mungkin patut dipertimbangkan jika memiliki menu Anda tanpa ruang lingkup terkait adalah cara yang tepat untuk pergi. Ini bukan cara sudut.
Tetapi, jika itu adalah cara yang Anda butuhkan, maka Anda dapat melakukannya dengan menambahkan fungsi ke $ rootScope dan kemudian dalam fungsi-fungsi tersebut menggunakan $ broadcast untuk mengirim acara. controller Anda kemudian menggunakan $ untuk mendengarkan acara-acara tersebut.
Hal lain yang perlu dipertimbangkan jika Anda akhirnya memiliki menu Anda tanpa ruang lingkup adalah bahwa jika Anda memiliki beberapa rute, maka semua pengendali Anda harus memiliki fungsi sendiri dan fungsi yang baru. (ini dengan asumsi Anda memiliki beberapa pengendali)
sumber
Saya menggunakan untuk bekerja dengan $ http, ketika ingin mendapatkan beberapa informasi dari sumber daya saya melakukan hal berikut:
Dan kode di controller:
Saya mengirim ke layanan fungsi apa yang harus dipanggil di controller
sumber
Saya memiliki beberapa rute dan beberapa pengendali, jadi saya tidak bisa mendapatkan jawaban yang diterima untuk bekerja. Saya menemukan bahwa menambahkan fungsi ke jendela berfungsi:
Kemudian di luar controller, ini bisa dilakukan:
sumber
Panggil fungsi Angular Scope dari luar controller.
sumber
Saya adalah pengguna kerangka kerja Ionic dan yang saya temukan yang akan secara konsisten memberikan $ lingkup pengontrol saat ini adalah:
angular.element(document.querySelector('ion-view[nav-view="active"]')).scope()
Saya menduga ini dapat dimodifikasi agar sesuai dengan sebagian besar skenario terlepas dari kerangka (atau tidak) dengan menemukan kueri yang akan menargetkan elemen DOM spesifik (s) yang tersedia hanya selama turunan controller yang diberikan.
sumber