Модели и коллекции в Angular?

Я приехал из Backbone, так что, возможно, это повредит моей точке зрения, но у меня возникли проблемы с поиском лучшего способа моделирования данных в Angular. Двухстороннее связывание данных довольно круто, но когда я хочу иметь постоянные классы коллекций и моделей, я запутался.

Я привык определять коллекцию, скажем, пользователей, а затем вызывать .fetch () всякий раз, когда я хочу обновить ее новыми моделями. Также я могу определять пользовательские методы для коллекции, а также для каждой модели.

var users = new UserCollection();
users.fetch();
users.doSomethingCustom()
users.at(0).doSomethingModel();

До сих пор я смотрел на Restangular и ngActiveResource, и ни один из них не предлагает такую ​​же функциональность, как я ожидал.

Есть ли что-то, что я пропускаю или, возможно, я думаю об этом неангулярно?

РЕДАКТИРОВАТЬ: я закончил создавать свои собственные модели /коллекции, очень похожие на Backbone, если это кому-нибудь поможет: https: //github.com/evanhobbs/angular-models

7 голосов | спросил Evan Hobbs 12 J0000006Europe/Moscow 2014, 19:10:31

2 ответа


0

Это действительно очень интересный вопрос, и я бы хотел, чтобы люди думали о решениях. Теоретически, вы можете придерживаться моделей Backbone. Это может привести к снижению производительности, но нет никаких причин, по которым это не сработает.

Разрабатывайте слой модели, не думая об AngularJS. Затем вам нужно расширить свои модели и добавить слушатель в функцию инициализации, которая будет вызывать $ rootScope. $ apply при каждом изменении модели, то же самое для любой коллекции, которую вы можете использовать. Что-то вроде:

/*global angular,Backbone*/
angular.module('ng')
    .value('Backbone', Backbone)
    .factory('AngularModel', function(Backbone, $rootScope) {
        return Backbone.Model.extend({
            initialize: function() {
                this.on('all', function() {
                    if (!$rootScope.$$phase) {
                        $rootScope.$apply();
                    }
                });
            }
        });
    })
    .factory('AngularCollection', function(AngularModel, $rootScope) {
        return Backbone.Collection.extend({
            model: AngularModel,
            initialize: function() {
                this.on('all', function() {
                    if (!$rootScope.$$phase) {
                        $rootScope.$apply();
                    }
                });
            }
        });
    });

function Main($scope, AngularCollection) {
    $scope.collection = new AngularCollection([{
        name: "foo"
    }, {
        name: "bar"
    }, {
        name: "baz"
    }]);
    $scope.addModel = function(model) {
        $scope.collection.add(model);
    };

}

и вид

              

<body ng-app ng-controller="Main">
    <div ng-repeat="model in collection.models">{{model.get('name')}}</div>
    <form name="model_form" ng-submit="addModel(model)">
        <fieldset>
            <legend>Add model</legend>
            <label for="">Name</label>
            <input type="text" ng-model="model.name" />
            <input type="submit" />
        </fieldset>

    </form>
</body>

Некоторые ДЕМО ЗДЕСЬ

Теперь, на мой взгляд, AngularJS лучше работает с необработанными хэшами js. Но если вам нужно что-то перенести на AngularJS из Backbone, это может быть решением, если у вас уже есть сильный слой модели.

РЕДАКТИРОВАТЬ: он может работать без дорогостоящего $ rootScope. $ apply,

ответил mpm 12 J0000006Europe/Moscow 2014, 23:03:32
0

js-data-angular может быть решение вашей проблемы. Он определяет коллекции, их отношения и различные адаптеры хранения с их функциями извлечения.

ответил Raymundus 14 FebruaryEurope/MoscowbSat, 14 Feb 2015 20:51:07 +0300000000pmSat, 14 Feb 2015 20:51:07 +030015 2015, 20:51:07

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132