这个问题对我来说也很重要。AngularJS 主页上有一些示例(您可以称它们为小部件),因此我查看了它们的源代码以尝试了解它们是如何分离小部件的。
首先,他们从不声明“ng-app”属性。他们使用
function bootstrap() {
if (window.prettyPrint && window.$ && $.fn.popover && angular.bootstrap &&
hasModule('ngLocal.sk') && hasModule('ngLocal.us') && hasModule('homepage') && hasModule('ngResource')) {
$(function(){
angular.bootstrap(document, ['homepage', 'ngLocal.us']);
});
}
}
以确保一切都正确加载。好主意,但奇怪的是他们将 ng-app 属性推给你这么多,然后甚至不自己使用它。无论如何,这里是他们与应用程序一起加载的主页模块 - http://angularjs.org/js/homepage.js
其中有一个名为 appRun 的指令
.directive('appRun', function(fetchCode, $templateCache, $browser) {
return {
terminal: true,
link: function(scope, element, attrs) {
var modules = [];
modules.push(function($provide, $locationProvider) {
$provide.value('$templateCache', {
get: function(key) {
var value = $templateCache.get(key);
if (value) {
value = value.replace(/\#\//mg, '/');
}
return value;
}
});
$provide.value('$anchorScroll', angular.noop);
$provide.value('$browser', $browser);
$locationProvider.html5Mode(true);
$locationProvider.hashPrefix('!');
});
if (attrs.module) {
modules.push(attrs.module);
}
element.html(fetchCode(attrs.appRun));
element.bind('click', function(event) {
if (event.target.attributes.getNamedItem('ng-click')) {
event.preventDefault();
}
});
angular.bootstrap(element, modules);
}
};
})
我将使用 ToDo 列表作为示例。对于 html,他们有
<div app-run="todo.html" class="well"></div>
然后在他们拥有的页面底部
<script type="text/ng-template" id="todo.html">
<h2>Todo</h2>
<div ng-controller="TodoCtrl">
<span>{{remaining()}} of {{todos.length}} remaining</span>
[ <a href="" ng-click="archive()">archive</a> ]
<ul class="unstyled">
<li ng-repeat="todo in todos">
<input type="checkbox" ng-model="todo.done">
<span class="done-{{todo.done}}">{{todo.text}}</span>
</li>
</ul>
<form ng-submit="addTodo()">
<input type="text" ng-model="todoText" size="30"
placeholder="add new todo here">
<input class="btn-primary" type="submit" value="add">
</form>
</div>
</script>
他们还有
<style type="text/css" id="todo.css"> //style stuff here </style>
<script id="todo.js"> //controller stuff here </script>
使用了代码,但这些脚本上的 id 属性对于运行应用程序并不重要。这只是应用左侧的源代码显示。
基本上,他们有一个名为 appRun 的指令,它使用函数 fetchCode
.factory('fetchCode', function(indent) {
return function get(id, spaces) {
return indent(angular.element(document.getElementById(id)).html(), spaces);
}
})
获取代码。然后他们使用 angular.bootstrap() 创建一个新的应用程序。他们还可以通过 app-run 加载模块。JavaScript 项目示例的初始化如下
<div app-run="project.html" module="project" class="well"></div>
希望这会有所帮助。我仍然不确定什么是“最佳”技术,但 AngularJS 主页似乎只是为每个示例/小部件使用了一个完全独立的 Angular 应用程序(ng-app)。我想我也会这样做,除了更改 fetchCode 函数以使用 AJAX 获取内容。