AngularJS监视服务值更改而不是范围继承

时间:2013-03-01 13:23:24

标签: angularjs

我只是尝试一下AngularJS。我尝试做一些非常简单的事情,但我想这样做。

我在表格中列出了一个项目列表,其中显示了每个项目的名称和数量。 我在表格下面有一个表格。

当我点击表格中的项目名称时,我希望通过表格可以更新给定的项目。

我用小提琴http://jsfiddle.net/5cRte/1/

实现范围继承

查看:

<tr ng-repeat="item in items">
  <td><a href="#" ng-click="selectCurrentItem(item)">{{item.name}}</a></td>
  <td>{{item.quantity}}</td>
</tr>

控制器:

function ItemListController($scope){
    $scope.items = [{name:'item1', quantity:10}, {name:'item2', quantity:5}];

    $scope.selectCurrentItem = function(currentItem) {
        $scope.currentItem = currentItem;
    }
}

function ItemFormController($scope){
    $scope.$watch('currentItem', function() {
        $scope.item = $scope.currentItem; 
    });
}

但是我读过一些主题,以这种方式耦合控制器范围并不是一个好习惯,最好不要使用服务来存储控制器之间共享的变量。

我能够在服务中放置一个静态变量并在另一个控制器中检索它,但是当我点击表中的项目时我无法更新它,因为看起来没有处理服务变量。你有这个暗示吗?

提前致谢

1 个答案:

答案 0 :(得分:3)

我不知道这是否是最佳的,但这是我能想到的

angular.module('myApp', []);

angular.module('myApp').factory('myService', function(){
    var items = [{name:'item1', quantity:10}, {name:'item2', quantity:5}, {name:'item3', quantity:50}];
    var current = {};
    return {
        getItems: function(){
            return items;
        },

        setCurrentItem: function(item){
            current.item = item;
        },

        removeCurrentItem: function(){
            delete current.item;
        },

        getCurrent: function(){
            return current;
        }
    }
});

function ItemListController($scope, myService){
    $scope.items = myService.getItems();

    $scope.selectCurrentItem = function(currentItem) {
        myService.setCurrentItem(currentItem);
    }
}

function ItemFormController($scope, myService){
    $scope.current = myService.getCurrent();
}

演示:Fiddle