2016-07-02 4 views
0

У меня этот класс, который хорошо работает, но мне было просто любопытно, можно ли его изменить, чтобы в моем шаблоне я мог ввести name вместо this.name. С классом класса ES5, я думаю, вы можете сделать что-то вроде this.template = function(content, i) {}, но я не получил this.template(content, i) {} для работы. Это даже возможно сделать, или я застрял писать this.name каждый раз, когда я хочу вернуть ключ от моего json?'this.name' в классе Javascript ES6, может это просто «имя»?

person = class { 
    constructor(data) { Object.assign(this, data); } 
    template(content, i) { 
    content.push(` 
     <div class="card"> 
     <div class="card-block"> 
      ${key('<h4 class="card-title">', this.name, '</h4>')} 
      ${key('<h6 class="card-subtitle text-muted">', this.title, '</h6>')} 
     </div> 
     <ul class="list-group list-group-flush"> 
      ${each('<li class="list-group-item">', this.school.reverse(), '</li>')} 
     </ul> 
     <div class="card-block"> 
      <a class="btn btn-secondary" href="#" role="button">Bio</a> 
     </div> 
     </div> 
    `); 
    } 
}; 
+0

Вы можете обернуть содержимое метода внутри инструкции 'with (this) {...}' ... если бы синтаксис класса не форсировал строгий режим, где 'with' запрещен. – Oriol

+0

Мне нравится звук этого. Заставляет меня хотеть преобразовать мой класс в ES5. – BarryMode

+0

Знайте, что «с» имеет важные эксплуатационные расходы и считается плохой практикой. Но да, будет работать. – Oriol

ответ

4

Да.

template(content, i) { 
    const {name, title, ...} = this; 
    content.push(` 
     <div class="card"> 
     <div class="card-block"> 
      ${key('<h4 class="card-title">', name, '</h4>')} 
      ... 

Придерживайтесь пользовательской системы шаблонов, если это не достаточно кратковременно.

Что касается this.template, то неправильное использование. template(content, i) { ... } - это синтаксис для методов класса, это ярлык для ;

+0

Я вижу, что это отвечает на мой вопрос. В моем случае использования я пытаюсь сохранить его, поэтому мне не нужно регистрировать имена ключей в переменной. Я пробовал следовать вашему методу с сгенерированными именами ключей, но у меня проблемы. Я не уверен, почему это не работает. 'var {Object.keys (this) .toString()} = this;' Я пытался создать объект по-разному, но, в конце концов, кажется, что его, возможно, нужно вводить вручную, чтобы избежать этого. Единственная причина, по которой я даже пытаюсь это сделать, так это то, что если у меня будет пользователь, который пишет шаблон, им не придется беспокоиться о написании чего-либо иного, кроме имен ключей. – BarryMode

+0

[Destructuring] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment) не работает так, вероятно, вам нужно больше узнать об этом. Это 'const {name, title, ...} = this' позволяет IDE выполнять статический анализ и предупреждать разработчика, если некоторые из этих свойств не существуют. Это то, что может предложить JS. Я бы рекомендовал не использовать 'with', потому что он имеет устаревший статус (по очень веским причинам). – estus

+0

Чтобы шаблоны, редактируемые для не-разработчиков, использовали сторонние шаблоны (Handlebars, Swig и т. Д.), Которые могут выполнить какое-то надежное задание и получить ключи из предоставленного контекста (например, 'this') автоматически. – estus

1
Use desctructing Es6 

person = class { 
    constructor(data) { Object.assign(this, data); } 
    template(content, i) { 
    let {name} = this; 
    content.push(` 
     <div class="card"> 
     <div class="card-block"> 
      ${key('<h4 class="card-title">', name, '</h4>')} 
      ${key('<h6 class="card-subtitle text-muted">', this.title, '</h6>')} 
     </div> 
     <ul class="list-group list-group-flush"> 
      ${each('<li class="list-group-item">', this.school.reverse(), '</li>')} 
     </ul> 
     <div class="card-block"> 
      <a class="btn btn-secondary" href="#" role="button">Bio</a> 
     </div> 
     </div> 
    `); 
    } 
};