2016-12-24 5 views
1

を働いていない配列をリセットしようとしているが、私はGitHubのに働いているプロジェクトです。このプログラムでhttps://github.com/joelt11753/Udacity-mapKnockout.JSアレイ - だからここ

、私はリストから作成されたメニューを持っています。私はHTML選択要素を使ってこのメニューをフィルタリングしています。デフォルトでは、すべてが表示されます。別のオプションを選択すると、メニューが変わります。現時点では、フィルタを実行するたびにメニューリストをリセットする必要があるという問題があります。

app.jsファイルを見ると、jsフォルダにあります。 8行目には、メニューをフィルタリングする計算されたオブザーバブルがあります。 10行目で、viewList()が空になるようにリセットしたことに注目してください。それは空である必要があるので、ユーザーの選択に応じて新しくフィルタリングを開始できます。ただし、10行目はデフォルトオプションが選択されている場合にのみ機能します。デフォルトは11行目の "if"です.20行目はフィルタリングされたメニューを表示するブロックを開始します。 21行目のconsole.logには正しい番号が表示されますが、リセットは発生していません。基本的に、私の質問は、なぜリセットは、選択が行われるたびに機能しないのですか?アプリを試してみると、デフォルト以外の別のオプションを選択すると、メニューは空になります。しかし、そうではありません。

ありがとうございました!あなたはこのよう

var arr = [1,2,3,4]; 
arr.splice(); 

に行うことができます

+0

javascript arr = [1,2,3,4];でこのように配列を消去できます。 arr.splice(0).. –

+0

涼しいので、1つ動作します。しかし、なぜ= [];のように配列を空に設定しないのですか?ワーキング? – Coder

答えて

0

まずアレイをリセットする方法から始めましょう。この

this.viewList = []; 

は機能しません。どうして?初めはviewListだと思います。それはko.observableArrayです。しかし、プレーンな配列を割り当てているため、observableArrayによって提供される機能が失われてしまいます。あなたはviewListに戻って、この式の値を割り当てない

this.viewList.removeAll(); 

注:それをクリアするための正しい方法はこれです。これは、removeAllが新しいコレクションを作成する代わりにコレクション自体を変更するためです。また、のようなオブジェクトへの永続的な参照を宣言考える:

var ViewModel = function() { 
    var self = this; 
    ... 
} 

それが原因でオブジェクトthisの点が変更される可能性という事実の一般的な良い習慣です。しかし、この方法では、オブジェクトの作成時と同じように、つまり作成されたオブジェクト自体のスナップショットを作成しています。あなたの質問に戻って、viewList.removeAll()を使用すると、ドロップダウンリストの下に表示される要素が正しく変更されます。表示される項目がどこから来るべきかわからないので(else˙ブランチにconsole.logと書いただけなので)、これをチェックし、問題が残っている場合は質問を更新してください。

1

これはあなたの空の配列を返します。