如何从另一个控制器更新控制器的 ng-repeat 模型?
How to update the ng-repeat model of controller from another controller?
我有两个 <div>
有自己的控制器。第一个 div 有一个 ng-model="listEntries"
。我在这个 <div>
的控制器中初始化 listEntries
。
app.controller('firstController', function($scope,serviceForFirst){
serviceForFirst.init();
serviceForFirst.getList($scope);
});
Html
<div ng-controller="firstController">
<ul>
<li ng-repeat="each in listEntries">
{{each.name}}
</li>
<ul>
</div>
我将 $scope
传递给 getList()
并在 serviceForFirst
中设置 $scope.listEntries
值。然后我将 listEntries
用作 ng-model
.
app.service('serviceForFirst',function(){
var list=[];
var init=function(){
list = [{....}];
};
var getList=function($scope){
$scope.listEntries = list;
};
var update=function(newEntity){
list.push(newEntity);
};
return{
init:init,
getList:getList,
update:update
};
});
这是我的第二个控制器和与之关联的服务。我打算在每次调用 addNew()
时将新元素推入 listAll
。这就是我正在尝试的方式。
app.controller('secondController', function($scope,serviceForSecond){
serviceForSecond.init();
$scope.addNew=function(newEntity){
serviceForSecond.addNew(newEntity);
};
});
app.service('serviceForSecond',function(serviceForFirst){
var entities=[];
var init=function(){
entities=[{....}];
};
var addNew=function(newEntity){
entities.push(newEntity);
serviceForFirst.update(newEntity);
return{
init:init,
addNew:addNew
};
});
本HTML本<div>
<div ng-controller="secondController">
....
<input type="text" ng-model="newName"/>
<button ng-click="addNew(newName)"/>
....
</div>
但是列表在第一个 <div>
中没有得到更新。如果我在设置 $scope.listEntries
之前尝试在 getList()
中执行 $scope.$apply()
然后我得到 $digest already in progress 错误。
当我执行 console.log()
时,我看到每个服务中的相应函数都被调用,但列表没有更新。
我应该如何更新列表?
您只需要一项服务,它包含您打算在不同控制器之间共享的数据。 Demo
模板
<ul ng-controller='Ctrl1'>
<li ng-repeat="item in items">
{{item}}
</li>
</ul>
<div ng-controller="Ctrl2">
<input type="text" ng-model="newName"/>
<button ng-click="addNew(newName)">Add</button>
</div>
控制器和服务
var app = angular.module('myApp', []);
app.controller('Ctrl1', function($scope, myListService){
$scope.items = myListService.getList();
});
app.controller('Ctrl2', function($scope, myListService){
$scope.addNew = myListService.add;
});
app.service('myListService',function(){
var list=[];
init();
function init(){
list = ['one', 'two', 'three'];
};
var getList=function(){
return list;
};
var add=function(newEntity){
list.push(newEntity);
};
return{
getList: getList,
add: add
};
});
我有两个 <div>
有自己的控制器。第一个 div 有一个 ng-model="listEntries"
。我在这个 <div>
的控制器中初始化 listEntries
。
app.controller('firstController', function($scope,serviceForFirst){
serviceForFirst.init();
serviceForFirst.getList($scope);
});
Html
<div ng-controller="firstController">
<ul>
<li ng-repeat="each in listEntries">
{{each.name}}
</li>
<ul>
</div>
我将 $scope
传递给 getList()
并在 serviceForFirst
中设置 $scope.listEntries
值。然后我将 listEntries
用作 ng-model
.
app.service('serviceForFirst',function(){
var list=[];
var init=function(){
list = [{....}];
};
var getList=function($scope){
$scope.listEntries = list;
};
var update=function(newEntity){
list.push(newEntity);
};
return{
init:init,
getList:getList,
update:update
};
});
这是我的第二个控制器和与之关联的服务。我打算在每次调用 addNew()
时将新元素推入 listAll
。这就是我正在尝试的方式。
app.controller('secondController', function($scope,serviceForSecond){
serviceForSecond.init();
$scope.addNew=function(newEntity){
serviceForSecond.addNew(newEntity);
};
});
app.service('serviceForSecond',function(serviceForFirst){
var entities=[];
var init=function(){
entities=[{....}];
};
var addNew=function(newEntity){
entities.push(newEntity);
serviceForFirst.update(newEntity);
return{
init:init,
addNew:addNew
};
});
本HTML本<div>
<div ng-controller="secondController">
....
<input type="text" ng-model="newName"/>
<button ng-click="addNew(newName)"/>
....
</div>
但是列表在第一个 <div>
中没有得到更新。如果我在设置 $scope.listEntries
之前尝试在 getList()
中执行 $scope.$apply()
然后我得到 $digest already in progress 错误。
当我执行 console.log()
时,我看到每个服务中的相应函数都被调用,但列表没有更新。
我应该如何更新列表?
您只需要一项服务,它包含您打算在不同控制器之间共享的数据。 Demo
模板
<ul ng-controller='Ctrl1'>
<li ng-repeat="item in items">
{{item}}
</li>
</ul>
<div ng-controller="Ctrl2">
<input type="text" ng-model="newName"/>
<button ng-click="addNew(newName)">Add</button>
</div>
控制器和服务
var app = angular.module('myApp', []);
app.controller('Ctrl1', function($scope, myListService){
$scope.items = myListService.getList();
});
app.controller('Ctrl2', function($scope, myListService){
$scope.addNew = myListService.add;
});
app.service('myListService',function(){
var list=[];
init();
function init(){
list = ['one', 'two', 'three'];
};
var getList=function(){
return list;
};
var add=function(newEntity){
list.push(newEntity);
};
return{
getList: getList,
add: add
};
});