2015-05-21 114 views
0

我注意到我在很多控制器上添加了一些代码来侦听事件并执行某些操作。几乎是这样的:在事件上收听指令

document.addEventListener("resume", function(e){ 
    $scope.doSomething(); 
    }, false); 

我意识到这不是清洁,有相同的代码随处可见,与变化的是$scope.doSomething()的唯一的事。

我想补充一点,作为一个指令,这样我可以有类似于:

<div on-resume="doSomething()"> 
</div> 

我尝试这样做(但它不工作):

.directive('onResume', function(){ 
    return { 
     restrict: 'A' 
     link: function(scope, elem, attr, ctrl) { 
     elem.bind('resume', function(e) { 
      fnName = attributes["onResume"]; 
      scope.$apply(function(){ 
       scope[fnName](); 
      }; 
     }); 
     } 
    }; 
}); 

的思考?

+0

把业务逻辑放在你的视图逻辑里真的看起来不是一个好主意。这属于服务或您的控制器。没有其他的事情可以做。使用这两种选项中的服务可以更轻松地管理它。 – Seer

+0

我不会把它当作业务逻辑来分解。基本上我试图简单地刷新我的控制器,当我的(混合)应用程序从iOS/Android的背景状态恢复。 – leonsas

+0

这不是查看逻辑。它属于服务。想象一下其他人进入这个代码库并试图找到处理这个代码的代码,它最终成为一些随机HTML标签的属性。 – Seer

回答

1

使用隔离作用域,您可以使用单向数据绑定传递函数。假设doSomething被定义为您的父范围的函数,这将与您所包含的HTML一起工作。

.directive('onResume', function() { 
    return { 
    restrict: 'A', 
    scope: { 
     onResume: '&' 
    }, 
    link: function(scope, elem, attr, ctrl) { 
     elem.bind('resume', function(e) { 
     scope.$apply(function() { 
      scope.onResume(); 
     }); 
     }); 
    } 
    }; 
});