javascript - AngularJS 模型逻辑放在哪里?

标签 javascript angularjs

我有一个处理 Shape POCO 对象的应用程序。我从 Angular js ShapeService 中检索这些形状对象。形状可以有宽度和高度,也可以被告知保持其纵横比。为此,我需要知道宽度或高度何时发生变化,以便我可以自动更改另一个以保持其比例。问题是,我把这个逻辑放在哪里?对我来说,这个逻辑属于 Shape 对象本身是有意义的,但我不确定如何让 shape 对象来强制执行它。

Shape 对象是否应该能够在其自身内部强制执行此规则?如果是这样怎么办?应该是服务责任吗?如果没有服务 $watch 我的 Controller 模型,我该如何做到这一点?还有其他我没有想到的方法吗?

最佳答案

最简单的方法是让 Shape 对象自行强制执行。毕竟,正如您所指出的,这就是 Shape 应该做的事情。

问题是如何让 Shape 强制执行它。这取决于 Shape 是什么以及它是怎样的。

如果 Shape 是 POJSO(普通旧 JS 对象),则无法强制执行它。

shapeA = {width:10,height:20,enforce:true}

没有什么可以阻止某些事情执行 shapeA.width = 20 并说:“哈哈!我忽略了你的强制执行!

如果您在有保证的 es5 环境中工作,可以使用 getter 和 setter/Object.defineProperty,那么您可以做一些有趣的事情,例如强制纵横比,因为将其更改为 shapeA.width = 20 将调用对象中的底层方法,然后该方法可以强制执行宽高比(或其他任何内容)。

如果您不能依赖 ES5 setter,并且需要强制执行它,则可以将对象设置为仅具有显式 setter

shapeA = {getWidth:function(){...}, setWidth: function(){...}, /* etc. */ }

虽然丑陋,但有效。

您也可以在 ShapeService 中再次通过函数来​​完成此操作。

您可以像第一个示例一样允许其自由形式,但在保存时强制执行行为。这不太好,因为错误可能会在屏幕上显示一段时间,直到保存为止,但它可以工作。

最后,您可以使用 Controller 和$scope.$watch,但我不喜欢这个解决方案。您会观看多少个这些形状?而这个逻辑在 Controller 中确实不存在。

我希望有一个更清晰的答案。只支持es5环境? :-)

关于javascript - AngularJS 模型逻辑放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27217078/

相关文章:

node.js - Karma 安装在重建 npm node.js 时失败

javascript - 如何在使用 .text() 时向文本添加空格

javascript - 在没有显式改变的情况下,reduce方法中的累加器值如何改变?

php - $_POST 为空,使用 Ajax 发送表单值

javascript - 无法附加带有静态选项的下拉列表

javascript - 以编程方式切换 ng-repeat 元素上的类

angularjs - Meteor、Laravel RESTful API + AngularJS 或 Laravel 用于我的下一个 Web 应用程序

javascript - 使用 indexOf 计算一个字母在 javascript 中出现的次数

javascript - JSON 有时未定义 - 我该如何检查?

node.js - 由于 js 错误过多,Gulp.js 无法编译 angular.js 项目?