2017-02-19 5 views
1

Непонятно, почему свойства контроллера, добавленные в init(), добавляются как 'undefined', а не по умолчанию. Я предполагаю, что вы должны определить в init(), чтобы избежать «leaking state»? Я думаю, что мне не хватает чего-то фундаментального здесь.Ember: настройка свойств контроллера в init()?

Когда свойство контроллера, такое как пустой массив, указывается прямо на контроллере, оно добавляется как 'Array[0]', которое затем позволяет вносить в него pushObject. При добавлении в init() они добавляются как 'undefined', поэтому pushObject не работает.

Смотрите демо на этом twiddle и/или код ниже:

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' 

}); 

В принципе, я хотел, чтобы выяснить, как объявить мой список запросов Params в одном месте (например, в конфигурационном файле), а не 3 места (маршрут, контроллер queryParams массив и сам контроллер)

Я создал twiddle, чтобы проиллюстрировать, что я имею в виду.

ответ

0

почему свойства контроллера добавлены в Init() добавлены как «не определено»

Если копнуть вглубь источников Ember, вы найдете много кода в Ember.Route, что «подготовить» запрос параметры для работы (например, вы можете попытаться проанализировать this code). Я предполагаю, что ответ на этот вопрос есть где-то в коде маршрута (возможно, маршрут инициализирует свойства до/после вызова контроллера контроллера или что-то в этом роде).

В принципе, я хотел, чтобы выяснить, как объявить мой список запросов Params в одном месте (например, в конфигурационном файле), а не 3 места (маршрут, контроллер queryParams массива, а сам контроллер)

Вы можете объявлять параметры в environment.js. Затем, в импорте контроллера он и перейти к 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

 Смежные вопросы

  • Нет связанных вопросов^_^