2015-05-21 70 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(); 
     }); 
     }); 
    } 
    }; 
});