2016-12-06 1 views
0

練習のために5回目に「従業員管理システム」を構築する予定です。私はコーディングのさまざまな方法を練習するたびに(うまくいけば、私はそれをうまくいくだろう)。私のチェーンはどこで壊れていますか?

後で私はいくつかのテキスト入力フォームと新しいus Employeeを登録するボタンを追加してリストに表示します。

今回は、このコードを「Web App」オリエンティシングで実行しています。 ほとんどのJavascriptですべてのHTMLを作成したいと思います。

  1. 教師
  2. 開発
  3. CEO
  4. : は、私は、従業員の 3種類/クラスを持って最終的には、このシステムではindex.html

    にいくつかのHTMLを挿入しますclass Item内部のテンプレートを作成しました

各従業員タイプには異なる方法があります。 しかし、すべてのタイプの従業員が受ける2つの方法があります。 sayHello()およびcheckIn()。他のすべてのタイプが継承するclass Employeeのおかげです。とにかく

..私は2つの小さな機能に分割されるレンダリング機能たかっItem.js

  1. renderContainer() - parent-を作成するためのテンプレートをユーザーの詳細のコンテナ。

  2. renderDetails() - ユーザーの詳細のテンプレート。

返された値を確認したい場所でconsole.logを使ってdebbugingしようとしました。私はまだデバッガとその恩恵をもっているわけではない。

私のコードで何が間違っているのか分かりますか? この行に何が問題なのですか? this.container.find(".employee").html($details);

なぜそれが呼び出されているrenderContainer()に正しく渡されていないのですか?

gitリポジトリ: https://github.com/ueeieiie/ems3

script.jsファイル:

require('../styles/styles.scss'); 

import Employee from './Employee.js'; 
import Teacher from './Teacher.js'; 
import Developer from './Developer.js'; 
import CEO from './CEO.js'; 
import Item from './Item.js'; 

var $ = require('jquery'); 

// udi 
var udi = new CEO("Udi", "Cinephile", "CEO"); 
var udiItem = new Item(udi); 
udiItem.renderContainer(); 

// rani 
var rani = new Developer("rani", "Jaggling", "Developer"); 
var raniItem = new Item(rani); 
raniItem.renderContainer(); 

CEO.jsファイル:

import Employee from './Employee.js'; 

export default class CEO extends Employee { 
    constructor(name, skill, title){ 
     super(name, skill, title="CEO") 
    } 
    fireEveryone(){ 
     console.log(this.name + " has fired EVERYONE!"); 
    } 
} 

開発。JSファイル:

import Employee from './Employee.js'; 

export default class Developer extends Employee { 
    constructor(name, skill, title){ 
     super(name, skill, title="Developer"); 
    } 
    pushCode(){ 
     console.log(this.name + " has pushed some code."); 
    } 
} 

Employee.jsファイル:

export default class Employee { 
    constructor(name, skill, title){ 
     this.name = name; 
     this.skill = skill; 
     this.title = title; 
    } 

    sayHello(){ 
     console.log(this.name + " said hello"); 
    } 

    checkIn(){ 
     console.log(new Date()); 
    } 
} 

Item.jsファイル:

var id = 0; 
var $ = require('jquery'); 

export default class Item{ 
    constructor(user){ 
     this.id = this.getId(); 
     this.name = user.name; 
     this.skill = user.skill; 
     this.title = user.title; 
    } 

    renderContainer(){ 
     var $container = $(` 
      <dl class="employee"> 

      </dl> 
     `); 

     this.container = $container; 

     this.renderDetails(); 
     $('.content').append($container); 

    } 

    renderDetails(){ 
     var $details = $(` 

     <p> 
      <dt>ID: </dt> 
      <dd>${this.id}</dd> 
     </p> 
     <p> 
      <dt>Name: </dt> 
      <dd>${this.name}</dd> 
     </p> 
     <p> 
      <dt>Skill: </dt> 
      <dd>${this.skill}</dd> 
     </p> 
     <p> 
      <dt>Title: </dt> 
      <dd>${this.title}</dd> 
     </p> 

     `); 
     this.container.find(".employee").html($details); 
     // $('.content').append($details); //works fine with no need of renderContainer() 
    } 

    getId(){ 
     return id++; 
    } 
} 

のindex.htmlファイル

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <meta http-equiv="X-UA-Compatible" content="ie=edge"> 
    <title>Document</title> 
</head> 
<body> 
    <div class="content"> 
     <!-- template comes here --> 
    </div> 
</body> 
</html> 
+1

もっと具体的な質問をすることができます "なぜそれは動作しません"?コードを実行したときに正確に何が起こったのか、実際に何が起こったのかとは異なることを期待していたことを説明してください。そして、あなたが取ったステップをデバッグするとき、そしてそのデバッグ(console.logステートメント、ブレークポイントなど)で学んだことを説明します。 – jfriend00

+0

はい、ありがとうございます、私はより具体的になり、更新されます – ueeieiie

答えて

1

私のコードで何が間違っているか教えてください。この行の何が問題なのですか this.container.find(".employee").html($details);

$(` 
     <dl class="employee"> 

     </dl> 
    `); 

あなたはその上.find()を呼び出すと、それは子孫だけ.employee.find()ので、検索に<dl>内検索:

this.containerはこのjQueryオブジェクトです。しかし、<dl>オブジェクトの中には.employeeがありません。したがって、.html()を呼び出してから何もしない空のjQueryオブジェクトを返します。ターゲットにしたい.employeeは既に子孫ではなく親です。

一致 セレクタによってフィルタリング要素は、jQueryオブジェクト、または要素の現在のセット内の各要素の子孫を取得します。ここでは

jQuery doc.find()のために言っていることです。これに

this.container.find(".employee").html($details); 

あなたはこのことから変更することで、そのコードを修正することができます

this.container.html($details); 

それとも、あなたはどこ.employeeテンプレートを処理するコードのための能力をしたい場合親または子孫のいずれかである場合は、それが親であることをテストできます。

if (this.container.is(".employee") { 
    this.container.html($details); 
} else { 
    this.container.find(".employee").html($details); 
} 
関連する問題