Как можно вызвать метод, определенный в дочерней области, из родительской области?
function ParentCntl() {
// I want to call the $scope.get here
}
function ChildCntl($scope) {
$scope.get = function() {
return "LOL";
}
}
angularjs
angularjs-scope
9синий
источник
источник
Ответы:
Вы можете использовать
$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"; }; });
Меньше кода и использование прототипного наследования.
Plunk
источник
$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.
источник