2017-02-19 3 views
1

Es ist schwer herauszufinden, warum Controller-Eigenschaften, die in init() hinzugefügt wurden, als 'undefined' hinzugefügt werden und nicht mit den Standardwerten. Ich denke, Sie sollten in init() definieren, um "leaking state" zu vermeiden? Ich denke, ich vermisse hier etwas Grundlegendes.Ember: Controller-Eigenschaften in init() einstellen?

Wenn eine Controller-Eigenschaft wie ein leeres Array direkt auf dem Controller angegeben wird, wird sie als 'Array[0]' hinzugefügt, was Ihnen dann ermöglicht, pushObject hineinzupacken. Wenn sie in init() hinzugefügt werden, werden sie als "undefined" hinzugefügt, so dass fehlschlägt.

Siehe Demo auf diesen twiddle und/oder dem folgenden Code:

import Ember from 'ember'; 

export default Ember.Controller.extend({ 

    queryParams: ['q','sort_method','search_type','filter1','filter2'], 

    init(){ 
     this._super(...arguments); 

     Ember.set(this, 'q', null); 
     Ember.set(this, 'sort_method', 'relevance'); // <-- sets default value to 'undefined' 
     Ember.set(this, 'filter1', []); // <-- sets default value to 'undefined' 
    }, 

    filter2: [], // <-- sets default values properly but will it cause state issues? 
    search_type: 'bar' 

}); 

Grundsätzlich ist ich will, um herauszufinden, wie meine Liste der Abfrage params an einem Ort zu erklären (wie in der Konfigurationsdatei), anstelle von 3 Stellen (Route, Controller QueryParams Array und zum Controller selbst)

Ich habe eine twiddle erstellt, um zu veranschaulichen, was ich meine.

Antwort

0

warum Controller-Eigenschaften in init() hinzugefügt werden hinzugefügt als 'undefiniert'

Wenn Sie tief in ember Quellen graben, können Sie eine Menge Code in Ember.Route finden, dass "vorbereiten" query Parameter zu arbeiten (zum Beispiel können Sie versuchen, this code zu analysieren). Ich denke, diese Antwort auf diese Frage ist irgendwo im Code der Route (wahrscheinlich route initialisieren Eigenschaften vor/nachdem Controller-Init aufgerufen wird oder so ähnlich).

Grundsätzlich ist ich will herausfinden, wie meine Liste der Abfrage params an einem Ort zu erklären (wie in der Konfigurationsdatei), anstatt 3 Plätze (Route, Controller queryParams Array und an den Controller selbst)

Sie können Parameter in environment.js deklarieren. Dann ist es in der Steuerung Import und passieren zu Ember.Controller.extend

import ENV from 'project-name/config/environment'; 

export default Ember.Controller.extend(Ember.$.extend({}, ENV.myDefaults.controller, { 
    actions: { 
    addFilter: function(key, value) { 
     alert(`adding "${value.toString()}" to controller property '${key}'`); 
     console.log("DUMP OF EMBER 'this':", this); 
     this[key].pushObject(value.toString()); 
    }  
    } 
})); 

See twiddle for details