В Angular 1.5, как связать компонент атрибута как boolean?

Я хотел бы знать, есть ли в Angular 1.5, когда вы используете компоненты, простой способ связать атрибут, который является логическим без преобразования в строку с @.

например, у меня есть два компонента "app-menu" и "app-menuitem" без трансклюдии. "app-menu "имеет только один атрибут-это список элементов для создания"app-menuitem".

<app-menu items="menuitems">

в menuitems, который является json, у вас есть атрибут menuitem с именем "isactive", который является логическим значение.

$scope.menuitems = [{ label : 'menuitem 1', isactive : true},{ label : 'menuitem 1', isactive : false}]

в компоненте меню :

angular.module('app')
    .component('appMenuitem', {
      transclude: false,
      controller: menuitemController,
      bindings: {
        label: '@',  
        isactive: '@' //<--- The problem is here because the boolean is converted as string
      },
      templateUrl: 'angular/components/simple/menuitem/menuitem.html'
    });

Я не знаю, лучший способ быть уверенным в конце-это реальное логическое, а не строка, которая делает меня некоторыми ошибками. У кого какие идеи ?

3 ответов


в angular 1.5 и далее вы можете использовать < & @ для односторонней привязки. Основная разница между этими двумя является < имеет возможность передать объект с его исходным типом данных компоненту.

isactive: '<'

просто используйте одностороннюю привязку вместо привязки строки:

angular.module('app')
    .component('appMenuitem', {
      transclude: false,
      controller: menuitemController,
      bindings: {
        label: '@',  
        isactive: '<'
      },
      templateUrl: 'angular/components/simple/menuitem/menuitem.html'
    });

< заставляет вас использовать true и false для ваших значений атрибутов, которые не совсем похожи на HTML. Например, мы часто пишем:

<input type="text" disabled>

вместо

<input type="text" disabled="disabled">

чтобы продолжить делать это с вашими компонентами AngularJS, вы можете использовать @ связывание с parse-string-boolean (или похожие) в $onChanges:

bindings: {
  paramSomething: '@something'
}

,

function $onChanges(changes) {
  if (changes.paramSomething) {
    switch (typeof this.paramSomething) {
      case 'string': {
        this.isSomething = parseBoolean(this.paramSomething, true);
        break;
      }
      case 'undefined': {
        this.isSomething = false;
        break;
      }
    }
  }

,

<my-component something></my-component>