我有一个处理 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/