Как можно вызвать метод, определенный в дочерней области, из родительской области?
function ParentCntl() {
// I want to call the $scope.get here
}
function ChildCntl($scope) {
$scope.get = function() {
return "LOL";
}
}
Как можно вызвать метод, определенный в дочерней области, из родительской области?
function ParentCntl() {
// I want to call the $scope.get here
}
function ChildCntl($scope) {
$scope.get = function() {
return "LOL";
}
}
Ответы:
Вы можете использовать $broadcast
от родителя к ребенку:
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";
}
}
Рабочая скрипка: http://jsfiddle.net/wUPdW/2/
ОБНОВЛЕНИЕ : есть еще одна версия, менее связная и более тестируемая:
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";
}
}
Скрипка: http://jsfiddle.net/uypo360u/
$scope.$parent
или внутри $scope.$parent.$parent
и т. Д.)? Ах да: передайте обратный вызов в params! :)
$emit
от ребенка к родителю. Думаю, пришло время обновить свой ответ ..
$parent
)
$broadcast
и вы сможете полностью исключить его pingBack
.
Позвольте предложить другое решение:
var app = angular.module("myNoteApp", []);
app.controller("ParentCntl", function($scope) {
$scope.obj = {};
});
app.controller("ChildCntl", function($scope) {
$scope.obj.get = function() {
return "LOL";
};
});
Меньше кода и использование прототипного наследования.
$scope.obj.get()
станет действительной функцией.
Зарегистрируйте дочернюю функцию в родительской при инициализации дочернего элемента. Я использовал обозначение «как» для ясности в шаблоне.
ШАБЛОН
<div ng-controller="ParentCntl as p">
<div ng-controller="ChildCntl as c" ng-init="p.init(c.get)"></div>
</div>
КОНТРОЛЛЕРЫ
...
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";
};
}
«Но, - скажете вы, ng-init
- нельзя так использовать !». Ну да, но
Я говорю, что это хорошее применение. Если вы хотите проголосовать против меня, пожалуйста, укажите причины! :)
Мне нравится этот подход, потому что он делает компоненты более модульными. Единственные привязки находятся в шаблоне и означают, что
Этот подход более близко подходит к идее Теро о модульности с помощью директив (обратите внимание, что в его модульном примере contestants
директива передается от родительской к «дочерней» В ШАБЛОНЕ).
В самом деле, другим решением может быть рассмотрение реализации ChildCntl
директивы as и использование &
привязки для регистрации init
метода.
Вы можете сделать дочерний объект.
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";
};
});
Здесь ребенок доказывает назначение метода get.