在Closure编译器属性重命名后,无法访问$ scope属性

时间:2014-12-09 21:42:48

标签: angularjs angularjs-scope google-closure-compiler google-closure

我有一个像这样的控制器:

/**
 * 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'] = '...'?

1 个答案:

答案 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");