哪里放AngularJS模型逻辑?

时间:2014-11-30 19:10:16

标签: javascript angularjs

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

Shape对象是否应该能够在自身内强制执行此规则?如果是这样的话?应该是服务责任吗?如果没有服务$ watch我的控制器型号怎么办呢?还有其他一些我没想到的方式?

1 个答案:

答案 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环境? : - )