加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – Angular-Meteor – 如何在基于包的设计中包含ng模

发布时间:2020-12-17 06:47:53 所属栏目:安全 来源:网络整理
导读:我有一个Angular-Meteor应用程序正在运行.我想将Angular模板和关联的控制器打包到Meteor包中,并通过添加该包将这些模板注入我的主应用程序. 什么是最好的方法? 更新2015-08-26 – 我想出了如何添加模板,如下所示.但是如何让Meteor包将模板的Angular控制器注
我有一个Angular-Meteor应用程序正在运行.我想将Angular模板和关联的控制器打包到Meteor包中,并通过添加该包将这些模板注入我的主应用程序.

什么是最好的方法?

更新2015-08-26 – 我想出了如何添加模板,如下所示.但是如何让Meteor包将模板的Angular控制器注入基础应用程序?

关键的搭配是Angular UI-router.

我有一个基本应用程序,其中包含名为packageprefix:packagename的包.在这个包中,我的代码位于包文件夹的根目录中:
myPackagedPage.ng.html – Angular HTML模板
myPackagedPage.js – 关联的Angular控制器

从我的主应用程序,我尝试创建一个到我的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软件包并遵循上述约定时,其控制器,路由和侧边栏链接将加载到主应用程序中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读