我有一个带有自定义模板的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(这是一个指令)如何工作,但我自己的指令却不起作用?我做错了什么?