在没有dom的情况下调用angularjs中深层定义的函数
我正在处理一些遗留代码,如下所示:在没有dom的情况下调用angularjs中深层定义的函数,angularjs,angularjs-scope,Angularjs,Angularjs Scope,我正在处理一些遗留代码,如下所示: angular.module("controllers.createEvent", []).controller("createEventItem", ["$rootScope", "$scope", "dialogService", "mainSvc", "eventSvc", "rulesSvc", "templateSvc", "notificationSvc", "syncSvc", "$log", function($rootScope, $
angular.module("controllers.createEvent", []).controller("createEventItem", ["$rootScope", "$scope", "dialogService", "mainSvc", "eventSvc", "rulesSvc", "templateSvc", "notificationSvc", "syncSvc", "$log",
function($rootScope, $scope, dialogService, mainSvc, eventSvc, rulesSvc, templateSvc, notificationSvc, syncSvc, $log) {
//...snip...
createEvent: function() {
var timezone = $scope.crtParams.myObj.itemType !== 300 ? ...snip...
var location = $scope.crtParams.location;
var name = $scope.crtParams.name;
var start = $scope.crtParams.start;
//complex business logic
//ultimately saving to a window.indexedDB
//...snip...
}
//...snip...
}]
);
在我看来,业务逻辑嵌套在这个与DOM紧密相连的角度结构中。我要做的是通过调用createEvent()插入一个项目数组。理想情况下,我希望我能编写如下代码:
var myImportedData = getDataSomehow();
for(var i=0; i<myImportedData.length; i++) {
angular.createEvent(
myImportedData[i].Name
,myImportedData[i].Start
,myImportedData[i].End
,myImportedData[i].etc...
,myImportedData[i].etc...
)
}
var myImportedData=getDataSomehow();
对于(var i=0;i,您可以使用$controller
服务实例化控制器
var myScope = $rootScope.$new();
var myVm = $controller("createEventItem", {$scope: myScope});
这将创建createEventItem
控制器的实例,其中$scope
注入了$rootScope
的子范围
有关详细信息,请参阅
示例代码可以放在运行块中
angular.module("myApp", ["controllers.createEvent"])
.run(function($rootScope, $controller) {
var myScope = $rootScope.$new();
var myVm = $controller("createEventItem", {$scope: myScope});
});
听起来这段代码应该被提取到一个服务或“工厂”。如果它只是该控制器的一部分,就不会有一个好的(阅读:不是hackey)方法(也不应该有,因为这真的破坏了MVC/MV*原则)最终,代码只能通过一组DOM控件对数据库进行插入。如果有人想在网页中添加另一个小部件来复制此功能,则不可能按原样-对吗?或者如果有人想添加另一个数据源作为数据库的输入(这是我的情况)那么这也是不可能的-对吗?重点是我相信这段代码写得很糟糕,或者至少不是未来的证明。我想说的是,出于这些原因,我认为我应该在将来不鼓励这种代码。-你同意吗?我同意。任何像这样的业务逻辑都应该从控制器中抽象出来,以便某种类型的服务。如果我复制dom,隐藏它,然后复制代码。然后构建我的循环来设置值,并模拟一个点击事件…我的意思是,这就是我们在这里讨论的。所以要么咬紧牙关,重写所有的dom,要么破解dom,使其符合代码。(非常感谢你的帮助,顺便说一句,这正是我想要的对话)我的意思是,我不能阻止你,但这肯定不是“角度”的方式。这听起来像是一场噩梦。但是,是的,我怀疑你可以设计一个重用该控制器的元素(不确定这是否有问题,需要一些测试),将其放入您的ng应用程序
容器中并模拟一个事件。我恐怕没有这样做:$rootScope
,$scope
,$controller
未定义。