材质md-autocomplete在模板中带有指令

时间:2018-06-26 15:46:16

标签: angularjs angularjs-directive angularjs-material md-autocomplete

我有一个带有自定义模板的mdAutocomplete:

<md-autocomplete
  ng-init="searchText = row.name"
  ng-required="column.$required(row)"
  md-input-name="autocomplete"
  md-selected-item-change="row.name = row.linked.name; row.category = row.linked.category"
  md-search-text-change="row.name = searchText"
  md-selected-item="row.linked"
  md-search-text="searchText"
  md-item-text="item.name"
  md-items="item in $ctrl.options.callbacks.getMatches(searchText, row)"
  md-menu-class="manager-autocomplete"
  style="min-width: 100px">

  <md-item-template>
    <div class="item-title">
      <span 
        md-highlight-text="searchText"
        md-highlight-flags="i">{{ item.name }}
      </span>
      <!-- Here I have my custom directive -->
      <span
        pluralize="child"
        count="item.getChildren().length"
        style="color: gray">        
      </span>
    </div>

    <div class="item-metadata">
      <span><span style="color: gray">from</span> {{ item.getParent().name }}</span>
    </div>
  </md-item-template>

</md-autocomplete>

我正在使用一个称为“复数”的自定义指令。这是我的指令代码:(由ES6制成)

import pluralize from 'pluralize';

class Pluralize {
  constructor () {
    this.restrict = 'A';
    this.template = '{{ count }} {{ unit }}'; // 1 child // 2 children
    this.scope = {
      pluralize: '@', // the word you want to pluralize
      count: '='      // if it is different than 1, it should pluralize
    };
  }

  /**
   * @param {angular.IScope} scope
   * @param {JQLite} element
   * @param {Object} attrs
   */
  link (scope, element, attrs) {
    // unit will be pluralized if count is different than 1
    scope.unit = pluralize(scope.pluralize, scope.count);
  }

  static create () {
    'ngInject';
    return new Pluralize(...arguments);
  }
}

export default Pluralize.create;

好的,到目前为止!但是,当我测试结果时,不知何故,unit属性随另一行而改变,而count属性却是必须存在的地方。让我给你演示:

数字是“计数”属性,它应该在其中,但是复数“子”不能正常工作,就像它们以某种方式改变了顺序一样。 “复数化”功能运行良好,如果count为1,则单位必须为“子级”。

我猜想,由于指令中link方法内部的count值没有更改,因此它可以正确编译。但是不知何故,当angularjs编译mdAutocomplete时,它失去了顺序,并且指令链接结果被编译在错误的位置……我不明白。

啊...如果您在指令中创建另一个道具,例如“值”,并在链接方法上给它分配计数,那么在模板上放置“值”而不是“计数”,它也会改变数字顺序。该行将具有错误的值和错误的单位。

编辑

一种解决方案是使用过滤器而不是指令。第二种解决方案是使用ngPluralize,但这使我感到奇怪:ngPluralize(这是一个指令)如何工作,但我自己的指令却不起作用?我做错了什么?

0 个答案:

没有答案