用于多个html节和来自ajax请求angularjs的数据的单个控制器
我试图用相同的json数据显示html页面的两个部分,我不想将它们包装在同一个控制器中,因为它们位于不同的区域。我已经通过在“angular service”中使用本地json数据成功地实现了这个概念,请参见演示用于多个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=
<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();
};
});