angular creation data holder / repository

时间:2016-07-29 13:22:32

标签: javascript angularjs repository

我正在尝试在控制器之间共享数据。我来自C#环境,我习惯于创建一个包含私有成员的类以及一些用于检索和操作/存储数据的方法。

这是我想到的一个非常简单的例子

public class MyRepository
{
    private List<string> Items { get; set; }

    public MyRepository()
    {
        Items = new List<string>();
    }

    public List<string> Get()
    {
        return Items;
    }

    public string GetById(int Id)
    {
        return Items[Id];
    }

    public void AddItem(string sNewItem)
    {
        Items.Add(sNewItem);
    }

    public void DeleteItems()
    {
        Items.Clear();
    }

}

现在回到Angular,我做了一些研究,发现为了能够共享数据(创建上面提到的存储库),我必须创建一个名为Service的东西。好吧,没问题,我按照指南做了这样的事情:

angular.module("IP-APP", ["ngRoute"])
    .factory("Item", function () {
        var savedItem = {};

        function set(newItem) {
            savedItem = newItem;
        };

        function get() {
            return savedItem;
        };

        return {
            set: set,
            get: get
        };
    })

然后我可以注入我的控制器。这很好用,直到我尝试定义我自己的方法,如GetById。突然Angular返回.GetById is not a function

我的问题是 - 是否有可能以我已经提到的方式创建存储库(能够定义自定义函数,如GetById)?如果是的话,如何正确地做到这一点?

对此事的任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

在阅读了几篇帖子后,我意识到,我错过了最后的libc.so声明。以下是我设法编辑代码的方法:

return

然后在我的控制器中:

angular.module("IP-APP", ["ngRoute"])
    .factory("Items", function () {
        this.savedItems = [];

        function set(newItem) {
            this.savedItems = newItem;
        };

        function get() {
            return this.savedItems;
        };

        function GetById(id)
        {
            var returnedItem = {};
            angular.forEach(this.savedItems, function (value, key) {
                if (value.id == id)
                    returnedItem = value;
            });

            return returnedItem;
        }

        return {
            set: set,
            get: get,
            GetById: GetById
        };
    })

这种方法对我的Angular应用程序中的addopt是否正确?

答案 1 :(得分:1)

请参阅使用service方法在角度项目中共享数据的可能解决方案。

我已经模拟了您的数据设置,并按ID返回所有或特定项目。 请参阅代码或JSFiddle

查看

<div ng-app="myApp">
 <div ng-controller="testCtrl">
    <b>Get all Service data</b><br/>
    <div ng-repeat="bot in data">
      {{bot.name}}   {{bot.id}}
    </div>
    <br/><br/>
    <b>Get 1 item with id from service</b><br/>
    {{bot.name}} - {{bot.id}}
  </div>
</div>

控制器&amp;服务

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

// Service (singleton)
myApp.service('userService', function() {
    // data
  var savedItems = [];

  function setItem(newItem) {
    if(angular.isUndefined(newItem)) return;
    savedItems[newItem.id] = newItem;
  };

  function getAll() {
    return savedItems;
  };

  function getById(id) {
    if(angular.isUndefined(id)) return;
    return savedItems[id];
  };

  return {
    set: setItem,
    getAll: getAll,
    getById: getById
  };


});

// controller
myApp.controller("testCtrl", function($scope, userService) {
    // set data
  userService.set({'name' : 'bot1', 'id':1});
  userService.set({'name' : 'bot2', 'id':2});
  userService.set({'name' : 'bot3', 'id':3});
  userService.set({'name' : 'bot4', 'id':4});
    // get all
  $scope.data = userService.getAll();
  // get bot1 by id 1
  $scope.bot = userService.getById(1);
})

See Fiddle for demo