我有一个像这样的控制器:
/**
* Widget Controller.
* @param {!angular.Scope} $scope The current controller $scope.
* @constructor
* @ngInject
* @export
*/
name.space.widgetController = function($scope) {
/**
* Scope reference.
* @type {!angular.Scope}
* @private
*/
this.scope_ = $scope;
// Get the initial widgets list...
this.getWidgets_();
}
/**
* Updates the current list of widgets.
* @export
*/
name.space.widgetController.prototype.getWidgets = function() {
this.scope_.widgets = name.space.WidgetsController.DEFAULT_WIDGETS_LIST_;
};
/**
* The default widgets list.
* @const {!Array.<{!Object}>}
* @private
*/
name.space.WidgetsController.DEFAULT_WIDGETS_LIST_ = [
{name: 'Foo', color: 'Orange'},
{name: 'Bar', color: 'Black'}
];
我有一个这样的模板:
<pre>{{ widgets | json }}</pre>
<table class=" table table-striped">
<thead>
<tr>
<th>Name</th>
<th>Color</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="widget in widgets">
<td>{{ widget.name }}</td>
<td>{{ widget.color}}</td>
</tr>
</tbody>
</table>
使用Closure编译器编译好的一切:
java -jar closure/compiler.jar \
'src/app/**.js' '!**_test.js' 'vendor/closure-library/' \
--angular_pass \
--externs src/externs/**.js \
--js_output_file public/javascripts/application.js \
--generate_exports \
--only_closure_dependencies \
--closure_entry_point=name.space.app \
--compilation_level='ADVANCED_OPTIMIZATIONS' \
--output_wrapper='(function(){%output%})();//# sourceMappingURL=application.js.map' \
--create_source_map='./public/javascripts/application.js.map'
...但模板无法访问该属性。检查后,我的$ scope.widgets重命名为$ scope.a。我可以将属性更改为$ scope [&#39;小部件&#39;],但它确实有效,但这看起来并不合适。
我可以做些什么来让模板正确访问属性?似乎模板也可能需要重命名属性。
编辑:
我 能够使用@expose
属性(正如我在下面@Adobe Flex Coder 0622提供的链接中找到的那样),但我仍然想知道这是否是正确的方法这个问题。更新的代码如下所示:
/**
* Updates the current list of widgets.
* @export
*/
name.space.widgetController.prototype.getWidgets = function() {
/** @expose */
this.scope_.widgets = name.space.WidgetsController.DEFAULT_WIDGETS_LIST_;
};
编辑:
我现在更加矛盾了。 @expose
有效...但根据此Closure Error Reference页面(请参阅标题_JSC_UNSAFE_NAMESPACE_),不推荐使用它:
没有简单的解决方法,因为@expose已被弃用且不应该被删除 用过的。如果您希望某个属性不被混淆,请将其作为 这[&#39;示例&#39;]而不是this.sample(你还需要修复所有 参考文献)。
......该怎么办?
scope['property'] = '...'?
?
答案 0 :(得分:1)
根据这篇文章,Google Closure Compiler您得到的结果是准确的。您还可以使用的一件事是$ inject命令。控制器命令看起来像这样。
name.space.widgetController = function($scope) {
/**
* Scope reference.
* @type {!angular.Scope}
* @private
*/
this.scope_ = $scope;
// Get the initial widgets list...
this.getWidgets_();
}
widgetController.$inject("$scope");