我有一个主页面,它只包含两个部分:导航标题和动态内容。
的index.html:
<div ng-controller='MainCtrl'>
<li ng-repeat="nav in navs">
<a href="#{{nav.url}}">{{nav.name}}</a>
</li>
</div>
<div ng-view></div> <!-- replaced by ngRoute -->
导航如下:
app.config(function($routeProvider, $locationProvider) {
$routeProvider.when("/test", {
templateUrl : "templates/test.html",
controller : "testController"
});
});
标题链接应由每个Web服务请求的后端提供。
问题:如何从另一个控制器(接收get响应的控制器)中触发以下init
函数?我后来想要从不同的控制器中触发这个方法。
app.controller('MainCtrl', ['$scope', function($scope) {
this.init = function(data) {
$scope.navs = data;
}
}]);
我尝试了以下操作,但没有效果:
的test.html:
<div>
<h1>some stuff provided by testController.js</h1>
</div>
testController.js:
angular.module('test').controller('testController', ['$scope', '$http', '$controller', function($scope, $http, $controller) {
$http.get(url)
.success(function(data) {
$controller('MainCtrl').init(data.mynavigation); //assume navigations exists
//process content in data
});
}]);
结果:
Error: [$injector:unpr] http://errors.angularjs.org/1.4.3/$injector/unpr?p0=%24scopeProvider%20%3C-%20%24scope%20%3C-%20MainCtrl
答案 0 :(得分:1)
我建议不要使用init设置数据,而是建议在$ scope控制器中注入一个服务,这样你就不需要在控制器中调用该函数,只需更改服务的数据。
这样的事情:
app.controller('MainCtrl', ['$scope', 'myService', function($scope, myService) {
this.navs = myService;
}]);
HTML:
<div ng-controller='MainCtrl'>
<li ng-repeat="nav.data in navs">
<a href="#{{nav.url}}">{{nav.name}}</a>
</li>
</div>
然后,您的服务:
app.factory('myService',function() {
var myService = {
data: [],
setData(data): function(data) {
this.data = data;
}
}
return myService;
});
这只是为了说明:myService是所有应用程序中的同一对象,如果更改myService.data,则注入此服务的每个控制器都将使用相同的数据。
因此,您将触发器放在另一个控制器中以更新此服务。此技术也用于在指令之间共享数据。
答案 1 :(得分:0)
如果要在控制器初始化中运行init函数,只需在控制器中调用this.init()
即可。
要继承,请考虑进行范围继承。文档中有一些示例:https://docs.angularjs.org/guide/controller
如果要重用呼叫/响应代码,可以考虑创建一个服务,并根据需要将其作为依赖项注入控制器。创建一个返回promise并在控制器内处理此promise的服务。
请参阅https://docs.angularjs.org/api/ng/service/ $ q以了解如何使用角度承诺。
有关服务使用的详细信息,请参阅AngularJS: Service vs provider vs factory。