在没有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
未定义。