Bagaimana memanggil metode yang didefinisikan dalam lingkup anak dari lingkup induknya?
function ParentCntl() {
// I want to call the $scope.get here
}
function ChildCntl($scope) {
$scope.get = function() {
return "LOL";
}
}
Bagaimana memanggil metode yang didefinisikan dalam lingkup anak dari lingkup induknya?
function ParentCntl() {
// I want to call the $scope.get here
}
function ChildCntl($scope) {
$scope.get = function() {
return "LOL";
}
}
Jawaban:
Anda dapat menggunakan $broadcastdari orang tua ke anak:
function ParentCntl($scope) {
$scope.msg = "";
$scope.get = function(){
$scope.$broadcast ('someEvent');
return $scope.msg;
}
}
function ChildCntl($scope) {
$scope.$on('someEvent', function(e) {
$scope.$parent.msg = $scope.get();
});
$scope.get = function(){
return "LOL";
}
}
Biola kerja: http://jsfiddle.net/wUPdW/2/
UPDATE : Ada versi lain, kurang digabungkan dan lebih dapat diuji:
function ParentCntl($scope) {
$scope.msg = "";
$scope.get = function(){
$scope.$broadcast ('someEvent');
return $scope.msg;
}
$scope.$on('pingBack', function(e,data) {
$scope.msg = data;
});
}
function ChildCntl($scope) {
$scope.$on('someEvent', function(e) {
$scope.$emit("pingBack", $scope.get());
});
$scope.get = function(){
return "LOL";
}
}
$scope.$parentatau di dalam $scope.$parent.$parent, dll)? Ah, ya: berikan panggilan balik di params! :)
$emitdari seorang anak menjadi orang tua. saya pikir ini adalah waktu untuk memperbarui jawaban saya ..
$parent)
$broadcastdan Anda dapat menghilangkan pingBacksemuanya.
Izinkan saya menyarankan solusi lain:
var app = angular.module("myNoteApp", []);
app.controller("ParentCntl", function($scope) {
$scope.obj = {};
});
app.controller("ChildCntl", function($scope) {
$scope.obj.get = function() {
return "LOL";
};
});
Lebih sedikit kode dan menggunakan pewarisan prototipe.
$scope.obj.get()fungsi valid.
Daftarkan fungsi anak pada orang tua ketika anak tersebut melakukan inisialisasi. Saya menggunakan "sebagai" notasi untuk kejelasan dalam template.
TEMPLATE
<div ng-controller="ParentCntl as p">
<div ng-controller="ChildCntl as c" ng-init="p.init(c.get)"></div>
</div>
PENGONTROL
...
function ParentCntl() {
var p = this;
p.init = function(fnToRegister) {
p.childGet = fnToRegister;
};
// call p.childGet when you want
}
function ChildCntl() {
var c = this;
c.get = function() {
return "LOL";
};
}
"Tapi", Anda berkata, " ng-init tidak seharusnya digunakan dengan cara ini !". Ya, tapi
Saya mengatakan ini adalah penggunaan yang baik untuk itu. Jika Anda ingin downvote saya, silahkan berkomentar dengan alasan! :)
Saya suka pendekatan ini karena ini membuat komponen lebih modular. Binding hanya ada di template, dan artinya
Pendekatan ini lebih mendekati gagasan Tero tentang modularising dengan arahan (perhatikan bahwa dalam contoh modularised, contestantsditeruskan dari induk ke arahan "anak" DI TEMPLATE).
Memang solusi lain mungkin mempertimbangkan penerapan ChildCntlsebagai arahan dan menggunakan &pengikatan untuk mendaftarkan initmetode.
Anda bisa membuat objek anak.
var app = angular.module("myApp", []);
app.controller("ParentCntl", function($scope) {
$scope.child= {};
$scope.get = function(){
return $scope.child.get(); // you can call it. it will return 'LOL'
}
// or you can call it directly like $scope.child.get() once it loaded.
});
app.controller("ChildCntl", function($scope) {
$scope.obj.get = function() {
return "LOL";
};
});
Di sini anak membuktikan tujuan metode get.