Angular-Meteor - 如何在基于包的设计中包含 ng 模板?
Angular-Meteor - How can I include ng template in package-based design?
我有一个 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 控制器 + 模板注入到包含的应用程序中。
在我的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-interests 的包中,我在根目录下有这些文件:package.js ,interests.ng.html,以及interests.js。 interests.js 将 Angular 控制器、Anguilar UI-router 路由注入到模板中,并将边栏 link 注入父应用程序.它通过使用 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',
templateUrl: 'ramshackle_bigd-interests_interests.ng.html',
controller: 'InterestsCtrl',
rank: 5
};
Session.set("BIGD.sidebar", sidebar);
var interestsItem = {label: 'Interests', link: '/interests', icon: "rocket"};
在我的父应用程序的 app.js 中,我从会话中动态加载控制器和路由,如下所示:
angular.module('bigdam',[
'angular-meteor',
'ui.router',
'angularify.semantic.sidebar',
'nvd3',
'leaflet-directive',
'ui.router.history'
])
.config(['$urlRouterProvider', '$stateProvider', '$locationProvider',
function($urlRouterProvider, $stateProvider, $locationProvider){
//console.log("app.js config!");
$locationProvider.html5Mode(true);
//add a static state
$stateProvider
.state('home', {
url: '/',
templateUrl: 'client/views/home/home.ng.html',
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 包并遵循上述约定时,它的控制器、路由和边栏 link 会加载到主应用程序中。
我有一个 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 控制器 + 模板注入到包含的应用程序中。
在我的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-interests 的包中,我在根目录下有这些文件:package.js ,interests.ng.html,以及interests.js。 interests.js 将 Angular 控制器、Anguilar UI-router 路由注入到模板中,并将边栏 link 注入父应用程序.它通过使用 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',
templateUrl: 'ramshackle_bigd-interests_interests.ng.html',
controller: 'InterestsCtrl',
rank: 5
};
Session.set("BIGD.sidebar", sidebar);
var interestsItem = {label: 'Interests', link: '/interests', icon: "rocket"};
在我的父应用程序的 app.js 中,我从会话中动态加载控制器和路由,如下所示:
angular.module('bigdam',[
'angular-meteor',
'ui.router',
'angularify.semantic.sidebar',
'nvd3',
'leaflet-directive',
'ui.router.history'
])
.config(['$urlRouterProvider', '$stateProvider', '$locationProvider',
function($urlRouterProvider, $stateProvider, $locationProvider){
//console.log("app.js config!");
$locationProvider.html5Mode(true);
//add a static state
$stateProvider
.state('home', {
url: '/',
templateUrl: 'client/views/home/home.ng.html',
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 包并遵循上述约定时,它的控制器、路由和边栏 link 会加载到主应用程序中。