Ember:在init()中设置控制器属性?

时间:2017-02-19 20:13:03

标签: ember.js

很难弄清楚为什么init()中添加的控制器属性被添加为' undefined'而不是默认值。我想你应该在init()中定义以避免" leaking state"?我想我在这里缺少一些基本的东西。

当在控制器上指定了一个像空数组这样的控制器属性时,它被添加为' Array[0]'然后允许你pushObject填入它。在init()中添加时,会将其添加为&{39; 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'

});

基本上,我想知道如何在一个地方(比如在配置文件中)声明我的查询参数列表,而不是3个地方(路由,控制器queryParams数组,以及控制器本身)< / p>

我创建了一个twiddle来说明我的意思。

1 个答案:

答案 0 :(得分:0)

  

为什么在init()中添加的控制器属性被添加为&#39; undefined&#39;

如果你深入挖掘余烬来源,你会在Ember.Route找到很多代码,&#34;准备&#34;查询参数有效(例如,您可以尝试分析this code)。我猜这个问题的答案是在路由代码中的某个地方(可能在控制器的初始化之前/之后路由初始化属性或类似的东西)。

  

基本上,我想知道如何在一个地方(比如在配置文件中)声明我的查询参数列表,而不是3个地方(路由,控制器queryParams数组,以及控制器本身)< / p>

您可以在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