如何修改控制器外的angularjs数据?

时间:2015-09-21 12:27:56

标签: javascript angularjs

我有一个主页面,它只包含两个部分:导航标题和动态内容。

的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

2 个答案:

答案 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