我有一个处理Shape POCO对象的应用程序。我从角度js ShapeService中检索这些形状对象。形状可以具有宽度和高度,也可以被告知保持其纵横比。为此,我需要知道宽度或高度何时发生变化,以便我可以自动更改另一个以保持其比率。问题是,我在哪里放这个逻辑?对我来说这个逻辑属于Shape对象本身是有意义的,但是我不确定如何使形状对象强制执行它。
Shape对象是否应该能够在自身内强制执行此规则?如果是这样的话?应该是服务责任吗?如果没有服务$ watch我的控制器型号怎么办呢?还有其他一些我没想到的方式?
答案 0 :(得分:1)
执行此操作的最简单方法是让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中完成。
您可以像第一个示例中那样允许自由格式,但在保存时执行行为。这不是很好,因为错误可以在屏幕上显示一段时间,直到它被保存,但它可以工作。
最后,你可以使用控制器和$scope.$watch
,但我并不喜欢这个解决方案。你会看到多少这些形状?而这个逻辑在控制器中确实不存在。
我希望有一个更清晰的答案。只支持es5环境? : - )