用于多个html节和来自ajax请求angularjs的数据的单个控制器

用于多个html节和来自ajax请求angularjs的数据的单个控制器,angularjs,angularjs-service,angularjs-factory,Angularjs,Angularjs Service,Angularjs Factory,我试图用相同的json数据显示html页面的两个部分,我不想将它们包装在同一个控制器中,因为它们位于不同的区域。我已经通过在“angular service”中使用本地json数据成功地实现了这个概念,请参见演示 <div ng-app="testApp"> <div ng-controller="nameCtrl"> <a href="#" ng-click="addName();">Add New</a> <a href=

我试图用相同的json数据显示html页面的两个部分,我不想将它们包装在同一个控制器中,因为它们位于不同的区域。我已经通过在“angular service”中使用本地json数据成功地实现了这个概念,请参见演示

<div ng-app="testApp">
<div ng-controller="nameCtrl">
    <a href="#" ng-click="addName();">Add New</a>
    <a href="#" ng-click="removeName();">Remove First</a>
    <ul id="first" class="navigation">
        <li ng-repeat="myname in mynames">{{myname.name}}</li>
    </ul>
</div>
<div>
    Lot of things in between
</div>

<ul id="second" class="popup" ng-controller="nameCtrl">
       <li ng-repeat="myname in mynames">{{myname.name}}</li>        
</ul>

接下来我要做的事情是向json文件发出http请求,并用数据加载我的两个部分,如果我添加或删除数据,它应该反映在这两个区域中

任何指针或现有演示都会非常有用


谢谢

您可以做的是将数据放在父作用域中(可能在$rootScope中),它将触发这两个视图,您不需要在此处$watch

 $rootScope.mynames        =   nameService.mynames;

请参见

之所以只有一个
ngRepeat
正在更新,是因为它们绑定到两个不同的数组

怎么会这样?这是因为您已经调用了两次
getNavTools()
,并且在每次调用中,您都用一个新数组替换了
mynames
!最后,
addName()
removeName()
正在处理最后分配的
mynames
数组,因此您看到了问题

我为您提供了解决方案:

testApp.service('nameService', function($http) {
    var me = this;
    me.mynames = []; // me.mynames should not be replaced by new result

    this.getNavTools = function(){
        return $http.post('/echo/json/', { data: data }).then(function(result) {
            var myname_json = JSON.parse(result.config.data.data.json);
            angular.copy(myname_json, me.mynames); // update mynames, not replace it
            return me.mynames;
        });
    };

    this.addName = function() {
        me.mynames.push({
            "name": "New Name"
        });
    };


    this.removeName = function() {
        me.mynames.pop();
    };
});

testApp.controller('nameCtrl', function ($scope, nameService) {

    // $scope.mynames        =   nameService.mynames; // remove, not needed

    nameService.getNavTools().then(function() {
        $scope.mynames = nameService.mynames;
    });

    /* Remove, not needed
    $scope.$watch(
        function(){ return nameService },

        function(newVal) {
            $scope.mynames          =  newVal.mynames;
        }
    );
    */

    $scope.addName = function() {
        nameService.addName();
    };

    $scope.removeName = function() {
        nameService.removeName();
    };
});

取消注释已注释的方法getNavTools时会发生什么情况。您只需要抽象您创建的静态mynames数组来调用getNavTools方法。我已经用http请求更新了演示,现在发生的只是最后一个html部分只有在我单击添加或删除链接jsfiddle.net/tomalex0/z6fEf/5/@user538776时才会更新。我根据更新的演示回答了您的问题,请查看。请同时更新您的问题。尝试限制$rootScope。在您的情况下,我只需要创建另一个控制器并使用相同的服务。一个控制器应该只负责你页面上的一个组件。是的,这是真的,也许他可以有一个顶级控制器,覆盖两个HTML视图。。。
testApp.service('nameService', function($http) {
    var me = this;
    me.mynames = []; // me.mynames should not be replaced by new result

    this.getNavTools = function(){
        return $http.post('/echo/json/', { data: data }).then(function(result) {
            var myname_json = JSON.parse(result.config.data.data.json);
            angular.copy(myname_json, me.mynames); // update mynames, not replace it
            return me.mynames;
        });
    };

    this.addName = function() {
        me.mynames.push({
            "name": "New Name"
        });
    };


    this.removeName = function() {
        me.mynames.pop();
    };
});

testApp.controller('nameCtrl', function ($scope, nameService) {

    // $scope.mynames        =   nameService.mynames; // remove, not needed

    nameService.getNavTools().then(function() {
        $scope.mynames = nameService.mynames;
    });

    /* Remove, not needed
    $scope.$watch(
        function(){ return nameService },

        function(newVal) {
            $scope.mynames          =  newVal.mynames;
        }
    );
    */

    $scope.addName = function() {
        nameService.addName();
    };

    $scope.removeName = function() {
        nameService.removeName();
    };
});