我有2个控制器。第一个获取所选项目,第二个获取可用项目。
如何显示新选择的项目?
每个可用项目下方的按钮都有一个ng-click,它调用名为updateItem的服务,我希望更新发生。
我一直在研究这个问题,我们非常感谢任何帮助。 -Thanks
<div ng-controller="seletedItemCtrl">
<p><i>I want to update this item</i></p>
<div ng-repeat="item in selectedItems">
<ul>
<li>{{item.color}}</li>
<li>{{item.Distance}}</li>
<li>{{item.height}}</li>
<li>{{item.name}}</li>
<li>{{item.year}}</li>
</ul>
</div>
</div >
///////////////////////////////////////////////////
<div ng-controller="availableItemsCtrl">
<div ng-repeat="item in availableItems">
<ul>
<li>{{item.color}}</li>
<li>{{item.Distance}}</li>
<li>{{item.height}}</li>
<li>{{item.name}}</li>
<li>{{item.year}}</li>
</ul>
<button ng-click = 'updateItem()' >select item</button>
</div>
</div>
JS
var app = angular.module('myApp', []);
function availableItemsCtrl($rootScope, $scope){
$scope.availableItems = {
"Items": {
"Item": {
"Group1": [
{
"color": "White",
"Distance": "NA",
"height": "3ft",
"name": "Underlift",
"year": "1955"
},
{
"color": "blue",
"Distance": "4M",
"height": "2ft",
"name": "Underlift",
"year": "1956"
},
{
"color": "red",
"Distance": "NA",
"height": "3ft",
"name": "Golen Leaf",
"year": "1968"
},
{
"color": "yellow",
"Distance": "22M",
"height": "10in",
"name": "Together",
"year": "1988"
}
]
},
}
}
$scope.availableItems = $scope.availableItems.Items.Item.Group1;
}
function seletedItemCtrl($rootScope, $scope){
$scope.seletedItem = {
"Items":{
"Item":{
"Group1":[{
"color": "black",
"Distance": "2M",
"height": "1in",
"name": "never",
"year": "1922"
}
]
}
}
}
$scope.selectedItems = $scope.seletedItem.Items.Item.Group1;
}
app.service("updateItem", function(){
console.log('update item');
});
答案 0 :(得分:7)
记住你的$scope
不是你的模特;您的$scope
就是将模型附加到的内容。 Angular鼓励您构建自己的模型对象来描述应用程序的行为。在此示例中,您似乎拥有“可用项目”和“所选项目”的域概念。这是一个简单的服务,为您提供这些概念的模型:
app.factory('Items', function () {
var Items = {
availableItems: [],
selectedItems: []
};
Items.addAvailableItem = function (item) {
Items.availableItems.push(item);
};
Items.selectItem = function (item) {
Items.selectedItems.push(item);
};
return Items;
});
现在你有了这个Items
服务,它有一个addAvailableItem
方法,它接受一个项目并将其添加到availableItems
数组,并使用selectItem
方法,它接受一个项目并将其添加到selectedItems
数组中。您现在可以使用控制器的范围将这两个数组绑定到视图中:
app.controller('someController', function ($scope, Items) {
$scope.availableItems = Items.availableItems;
};
这是一个jsFiddle,使用您提供的代码作为起点演示概念(它还演示了在模块中定义控制器的更好方法):http://jsfiddle.net/BinaryMuse/kV4mK/
答案 1 :(得分:1)
这是我的尝试:fiddle。
我不太了解你的数据结构,所以我稍微改了一下。但是,我认为重要的部分是 - 如何在控制器之间共享数据。
function availableItemsCtrl($rootScope, $scope, itemService) {
$scope.availableItems = [{
"color": "White",
...
}];
$scope.updateItem = itemService.storeSelectedItem;
itemService.storeSelectedItem($scope.availableItems[0]);
}
function selectedItemCtrl($scope, itemService) {
$scope.selectedItem = itemService.selectedItem;
}
app.service("itemService", function () {
var that = this;
this.selectedItem = {};
this.storeSelectedItem = function (item) {
angular.copy(item, that.selectedItem);
console.log('update item', item);
}
});
我花了很长时间才发现我必须使用angular.copy()而不是
that.selectedItem = item;
因为上面会导致selectedItem被赋予一个新的数组引用,selectedItemCtrl不会注意到 - 即$ scope.selectedItem仍然会引用前一个数组。
我很想知道其他人想出了什么。
更新:看起来我完全错过了您想要支持多个所选项目的事实。