Ionic - AngularJS:通过控制器外部的模板调用方法

Ionic - AngularJS: calling methods via template outside of Controller

所以,这是一个示例代码:

<div ng-controller="MyControllerOne">
    <span ng-click="foobar()">Click Me!</span>
</div>

我可以在不更改控制器的情况下从该模板调用 MyControllerTwo 中的函数 foobar():

.controller('MyControllerOne', function($scope) {
    //some code
})
.controller('MyControllerTwo', function($scope) {
    // method I wanna call
    function foobar(){
    }
})

虽然不是最漂亮的解决方案,但在技术上是可行的……大概。

如果您将 HTML 更新为:

<div ng-controller="MyControllerOne">
    <span ng-controller="MyControllerTwo as mct" ng-click="mct.foobar()">Click Me!</span>
</div>

那么你应该得到你预期的结果。

您可以通过在控制器中注入“$controller”服务,从模板中调用另一个控制器中的方法。下面是演示和代码。

你可以在这里看到演示:http://plnkr.co/edit/oBEKxamgJv0uDVsJJwth?p=preview

HTML:

  <body ng-controller="MainCtrl">
    <div ng-click="fooBar()">Click Me!</div>
  </body>

JS:

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope, $controller) {
  $controller('SubCtrl', {$scope: $scope});
});

app.controller('SubCtrl', function($scope) {
  $scope.fooBar = function() {
    alert('second controller');
  };
});

很老的问题,但如果有人仍在寻找替代答案... 应该可以使用 $emit 或 $broadcast.

来自 ControllerOne 的赞:

$rootScope.$broadcast('callToFoobat',{});

然后从 ControllerTwo :

$scope.$on('callToFoobat', function(){ 
    // whatever you want, so why not a call to foobar 
})

只是一个粗略的解决方案。可能比 $rootScope.$broadcast 更优雅或更轻巧。并且可能考虑在需要时停止传播。