angularjs – Angular-Meteor – 如何在基于包的设计中包含ng模
我有一个Angular-Meteor应用程序正在运行.我想将Angular模板和关联的控制器打包到Meteor包中,并通过添加该包将这些模板注入我的主应用程序.
什么是最好的方法? 更新2015-08-26 – 我想出了如何添加模板,如下所示.但是如何让Meteor包将模板的Angular控制器注入基础应用程序? 关键的搭配是Angular UI-router. 我有一个基本应用程序,其中包含名为packageprefix:packagename的包.在这个包中,我的代码位于包文件夹的根目录中: 从我的主应用程序,我尝试创建一个到我的Angular模板的路由,如下所示: angular.module('parentModule',[ 'angular-meteor','ui.router','angularify.semantic.sidebar' ]) .config(['$urlRouterProvider','$stateProvider','$locationProvider',function($urlRouterProvider,$stateProvider,$locationProvider){ console.log("app.js config!"); $locationProvider.html5Mode(true); $stateProvider .state('home',{ url: '/',templateUrl: 'client/views/home/home.ng.html',controller: 'HomeCtrl' }) .state('myPackagedPage',{ url: '/myPackagedPage',templateUrl: 'packageprefix_packagename/myPackagedPage.ng.html',controller: 'MyPackagedPageCtrl' }) ; $urlRouterProvider.otherwise('/'); }]) 应用程序成功找到myPackagedPage.ng.html文件并呈现它.但是如何添加控制器? 我尝试在我的包中添加它,但控制器函数不会被调用. console.log("myPackagedPage.js loaded"); angular.module('parentModule') .controller('MyPackagedPageCtrl',['$scope',function($scope){ console.log("MyPackagedPageCtrl"); }]) ; 我收到一个错误: Argument 'MyPackagedPageCtrl' is not a function,got undefined 解决方法
我现在有这个工作.这个方法对我来说很有用,可以将Meteor包中的Angular Controller模板注入到包含的应用程序中.
在我的package.js中,我有这个 Package.onUse(function(api) { api.versionsFrom('1.1.0.3'); api.use('angular:angular@1.4.4','client'); api.use("urigo:angular@0.9.3",'client'); api.use("session@1.1.0",'client'); //api.use('angularui:angular-ui-router@0.2.15','client'); api.addFiles('interests.js','client'); api.addFiles('interests.ng.html','client'); api.export("InterestsCtrl","client") }); 请注意,您必须导出控制器,以便父应用程序可以访问它. 在我的包中,名为ramshackle:bigd-interest,我在根级别拥有这些文件:package.js,interests.ng.html和interests.js. interests.js将Angular控制器,Anguilar UI路由器路由注入模板,以及侧栏链接到父应用程序.它通过使用Meteor Session实现了这一点.我玩过其他方式,但Session是唯一有效的方法.请注意正确确定会话变量名称的范围. //add controllers var controllers = Session.get("BIGD.controllers"); if (!controllers) controllers = {}; var interestsCtrlSpec = "'$scope',InterestsCtrl"; InterestsCtrl = function($scope){ console.log("InterestsCtrl running"); }; controllers.InterestsCtrl = interestsCtrlSpec; Session.set("BIGD.controllers",controllers); //add routes var routes = Session.get("BIGD.routes"); if (!routes) routes = {}; routes.interests = { url: '/interests',templateUrl: 'ramshackle_bigd-interests_interests.ng.html',controller: 'InterestsCtrl' }; Session.set("BIGD.routes",routes); //add sidebar links //the key determines sorting order var sidebar = Session.get("BIGD.sidebar"); if (!sidebar) sidebar = {}; sidebar["interests"] = { url: '/interests',controller: 'InterestsCtrl',rank: 5 }; Session.set("BIGD.sidebar",sidebar); var interestsItem = {label: 'Interests',link: '/interests',icon: "rocket"}; 在我的父应用程序的app.js中,我动态加载了会话中的控制器和路由,如下所示: angular.module('bigdam','angularify.semantic.sidebar','nvd3','leaflet-directive','ui.router.history' ]) .config(['$urlRouterProvider',$locationProvider){ //console.log("app.js config!"); $locationProvider.html5Mode(true); //add a static state $stateProvider .state('home',{ url: '/',controller: 'HomeCtrl' }); //add the dynamic routes/states from other Meteor packages for (var stateId in routes) { var route = routes[stateId]; $stateProvider .state(stateId,route); } $urlRouterProvider.otherwise('/'); }]) ; //Declare the controllers from plugins for (var controllerId in controllers) { var controllerSpec = controllers[controllerId]; var controllerSpecArray = eval("[" + controllerSpec + "]") angular.module('bigdam').controller(controllerId,controllerSpecArray); } 所以现在,当我创建一个新的Meteor软件包并遵循上述约定时,其控制器,路由和侧边栏链接将加载到主应用程序中. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |