如何为大型和可维护的应用构建angularJS模型?

时间:2013-08-08 14:22:33

标签: javascript angularjs

在我进军AngularJS时,我有点困惑。造成这种情况的主要原因是因为我从未真正理解,整个事物的模型部分是什么。我的意思是,它是一个MVC框架,所以它必须有模型,对吗?所以,我对此事做了一些阅读。我试着阅读this bit of documentation, here

我从中理解的是,控制器的模型方面,实际上是$scope字典中的内容。很好,这并没有打扰我,直到我读了一个话语制作者blog post by evil-trout

他试图得到的是,Angular没有适当的建模方案。我试着寻找答案,然后我碰到了this。这是一个很好的阅读,但实际上没有给我如何在AngularJS中构建模型的具体例子。

我觉得这确实缺乏,因为我已经习惯了django开发,并且拥有清晰的模型很有帮助。在emberjs中,似乎有一种方法可以制作继承自Ember类的模型。此外,在阅读了evil-trout的博客文章之后,我理解了将所有变量附加​​到范围的潜在缺陷,其中许多变量都是原始的,而不是对象。

那么,在AngularJS中构建模型的最佳方法是什么,以便将来可以使用可维护的代码。我坚持使用angular的主要原因是因为它写得非常简单,但是我担心它最终可能会像php一样,为了简单起见,功能常常被取代。

我希望我能够清楚地表达我的问题,如果没有,请随时发表评论,告诉我如何改进。

2 个答案:

答案 0 :(得分:7)

关于模型的事情

它们代表了一大块数据......

  • 该块可以来自API,一个静态文件,可以显式声明。
  • 可以通过应用中的事件进行更新。

他们可以是多个或一个......

  • 模型不一定是一个包罗万象的对象。如果您发现可以从单个模型中抽象出较小的模型,那么您已经发现了模块化代码。向您的父母注入子服务可确保关注点和可重用性的分离。

这里的一个很好的例子是考虑一个消耗两个API来构建单个模型的服务。你当然可以像这样构建它:

angular.module('things', [])
.factory('Things', function($http) {
    var _things = {};
    _things.getThing1 = function(){return $http.get('http://ONE.com/1')};
    _things.getThing2 = function(){return $http.get('http://TWO.com/2')};
    return _things;
};

但是如果你想在另一个项目中使用这些API调用呢?构成我的单一服务的组件是否真的最能代表他们自己的服务?

angular.module('thing1', [])
.factory('T1', function($http) {
    var _thing1 = {};
    _thing1.getThing1 = function(){return $http.get('http://ONE.com/1')};
    return _thing1;
};

angular.module('thing2', [])
.factory('T2', function($http) {
    var _thing2 = {};
    _thing2.getThing2 = function(){return $http.get('http://TWO.com/2')};
    return _thing2;
};

angular.module('things', ['thing1','thing2'])
.factory('Things', function(T1,T2) {
    var _things = {};
    _things.getThing1 = T1.getThing1();
    _things.getThing2 = T2.getThing2();
    return _things;
};

现在,您可以独立于thing1使用thing2things。这是个好消息,因为您正在处理的下一个项目不需要thing1,但肯定需要thing2。如果不出意外,模块化服务(或任何一般代码)将为您的应用提供结构,帮助您将事物识别为组件而不是blob。

答案 1 :(得分:1)

我们已经使用Angular一段时间了,我们已经提出了一个公约,帮助我们控制范围污染。

我们在每个控制器中的$scope变量上定义最多2个属性。 viewModelmodelviewModel是一个帮助我们实现简单模型绑定的对象,以及model对象,它是与CRUD操作视图相关的数据。

我们在主视图(ng-view),子视图(使用ng-include创建的视图),指令(如果我们创建隔离范围)中遵循此约定。

无耻插件:我写了一篇blog post详细介绍了这几天:)