2013-10-23 62 views
1

我有一個這樣的控制器(除去一堆東西):)如何從其他地方的腳本調用Angular控制器上的函數?

function SignupController($scope) { 

    function isDateOfBirthValid(day, month, year) { 
     // Process day, month and year and return a bool... 
     // Also update the view model with the appropriate validation message 
    } 
} 

函數isDateOfBirthValid(由控制器內部使用,但我也希望能夠從外部代碼調用它。

(我希望我會被告知這違反了角模式,但它確實可以節省我很多時間......)

怎麼辦,我需要改變控制器,這樣我可以把這個外部功能?我不能僅僅將該功能移到控制器之外,因爲該功能以一種重要的方式修改了視圖模型的狀態。

+0

究竟你 「外」 是什麼意思?從另一個Angular-Something或完全獨立的外部庫? – Scheintod

+0

後者。具體來說,一個jQuery插件的初始化代碼。 – David

回答

0

你的功能應該在顧慮之間分開。它的名字isDateOfBirthValid確實並不意味着它應該有任何副作用。

有副作用的功能部分應該移入擁有業務模型的服務中。你的控制器只需要反映模型的內容。控制器不是的型號。

This answers涉及如何更新角度外的服務。

+0

也許'validateDateOfBirth()'會是一個更好的名字。驗證邏輯有副作用,如顯示消息和修改CSS類是正常的。這些事情會影響視圖模型,我不相信我可以在控制器之外觸摸。 – David

2

比如,你可以使用角度服務

服務代碼

app.service('CommonFunctions', function() { 
    this.isDateOfBirthValid = function(day, month, year) { 
     /// your code here 
    }; 

    this.function2 = function() { 
     // your code here 
    }; 
}); 

控制器代碼

選項1

function SignupController($scope , CommonFunctions) { 

    $scope.isValidDOB = CommonFunctions.isDateOfBirthValid (1,2,2013); 
} 

選項2

var app = angular.module('app'); 
app.controller('SignupController', function($scope, $location, $routeParams, CommonFunctions) { 
    $scope.isValidDOB = CommonFunctions.isDateOfBirthValid (1,2,2013); 
}); 
+2

這一切都是有道理的,但它並沒有回答這個問題,即如何從Angular構造(即jQuery插件)之外調用該驗證方法。這個問題涉及在jQuery插件和Angular之間共享代碼...如果這甚至是一個有效的問題。也許如果插件是用指令初始化的,這個問題就會消失。 – backdesk

+1

看看http://stackoverflow.com/questions/16935095/correct-way-to-integrate-jquery-plugins-in-angular-js – backdesk

相關問題