我们说我从factory
获取一个对象列表,然后将其传递给controller
,并从那里将其呈现在directive
...到目前为止这是最好的做法,对吗?
同样假设每个对象都有save()
函数,如果我的指令如下:
.directive('Foo', function($modal) {
return {
restrict: 'EA',
require: 'ngModel',
transclude: true,
templateUrl: 'admin/foo.html',
scope: {
model: '=ngModel',
save: '&'
},
controller: function($scope) {
$scope.$watch('model', function(newVal, oldVal) {
init()
});
function init(){
// do some loops
};
$scope.doThis(){
// click event
}
$scope.checkThat(){
// some array methods
}
$scope.proxySave(){
// call passed in fn();
$scope.save({})
}
},
link: function(scope, element, attr, ngModel) {
// not really doing much here
}
从指令html开始,将会有一些定义为doThis()
的ng-click函数。
从关注点分离的角度来看,我认为它可以保留我的主控制器,但我在指令代码中并没有真正做很多DOM操作,除了链接到模板HTML和一大堆逻辑指令控制器。我的一些指令控制器大约有100行逻辑。
是因为我滥用ng-if来显示/隐藏?我应该使用链接功能吗?
答案 0 :(得分:5)
可能你的问题可能更像是表达意见,而不是提供正确的解决方案"。
如果指令没有公开可由其他指令(require: "^myDirective"
)使用的逻辑,我个人不会将控制器引入指令。所以我的大多数指令都有你在link: function (scope, element, attrs) {}
中放入控制器的代码。
但是如果有许多代码行与DOM操作无关,那么很可能它们包含一些非UI相关的业务逻辑,这些逻辑可以转移到服务中。有更好的重用机会和更清晰的关注点分离。
<强> TL; DR 强>
$scope.foo = function () { ... }
也可以住在link: function (...) {...}
this.bar = function ()
正如我已经说过的那样:这只是我的意见......
编辑我的意思是&#34;为您的模型添加逻辑&#34;?
JavaScript不仅是一种函数式编程语言,也可以用于面向对象。当然没有&#34;类&#34;,但是使用原型继承或ECMAScript 5功能(如getter和setter),可以创建一个外观和行为类似于Java或其他OOP语言的对象模型。 / p>
通常有非常小的业务逻辑&#34;片段&#34;,可以放到控制器,服务,过滤器或指令中。我不会将对象连接到大图并将所有逻辑(例如持久性逻辑)放到业务对象中。但是这些小的逻辑片段最好位于模型数据中,例如:
isExternal()
grossPrice
calculateFields()
roundToMinutes()
这给了我安全性,这种逻辑始终存在于&#34; raw&#34;数据和重复代码的风险较小。而且我不必总是将数据与正确的服务连接起来,并在视图中需要时在控制器或指令中公开这些服务。
编辑回答&#34;我滥用ng-if来显示/隐藏?&#34;
复杂UI必须显示/隐藏很多,具体取决于应用程序及其数据的状态。因此,在实际应用程序(不仅仅是小例子)中,有很多ng-if
和ng-show
/ ng-hide
或ng-switch
。看起来总是不错,但替代方案是什么? (如果您使用ng-if
和ng-if-start
,有时可以保存几个ng-if-end
,请参阅Multi-Element Directives)。