【问题标题】:How can I provide dynamic values for an 'extend'? (or 'how does extend work in this case' ?)如何为“扩展”提供动态值? (或“在这种情况下扩展如何工作”?)
【发布时间】:2019-11-13 00:03:57
【问题描述】:

我正在查看class (this one)。 doco for it suggests you can extend the class to change a property of the class。没错,它对我有用。

但是我想要做的是动态地提供设置的值。

我有两个问题。

第一

如何调整the demo 以便动态提供使用的值。

第二

当我查看课程时,我意识到这似乎是代码的重要部分......

  ajax (url, data = {}, method = this.method) {
    const ajaxSettings = assign(
      {},
      {
        contentType: false,
        processData: false,
        xhr: () => {
          const xhr = $.ajaxSettings.xhr();
          xhr.upload.onprogress = (event) => {
            this.didProgress(event);
          };
          this.one('isAborting', () => xhr.abort());
          return xhr;
        },
        url,
        data,
        method
      },
      get(this, 'ajaxSettings')
    );

    return this.ajaxPromise(ajaxSettings);
  },

...我不确定我理解“扩展”是如何做它正在做的事情的。 ajaxSettingsajax 函数中使用,那么extend 如何到达函数内部并将扩展中提供的值合并到函数中的硬编码值中?

希望这个问题是有道理的......如果你不写一本书就无法管理“第二”,我会很乐意回答“第一”;-)


回应cmets

【问题讨论】:

  • 你能发布extendget的定义吗?
  • @Bergi :感谢您的评论,我现在已经解决了这个问题,但我将编辑问题以包含这些定义以供其他人使用。

标签: javascript inheritance ember.js ecmascript-6 prototypal-inheritance


【解决方案1】:
  1. 如果您想动态设置ajaxSettings,您可以简单地将其设为计算属性:
import Uploader from 'ember-uploader/uploaders/uploader';
import { computed } from '@ember/object';

export default Uploader.extend({
  ajaxSettings: computed('someProperty', function() {
    // do your logic to set the options dynamically in here
    return {
      headers: {
        'X-Application-Name': 'Uploader Test'
      }
    };
  })
});
  1. 这确实是使用ajaxSettings 属性的地方,关键代码行是这一行:
get(this, 'ajaxSettings')

从类中检索ajaxSettings 属性(因此,如果在基类上设置了ajaxSettings,您的子类将覆盖基类设置——有关扩展的更多信息,请参阅here)。

该行与Object.assign()(技术上为Ember's polyfill)结合使用来构建选项。这部分提供了一些默认值:

{
  contentType: false,
  processData: false,
  xhr: () => {
    const xhr = $.ajaxSettings.xhr();
    xhr.upload.onprogress = (event) => {
      this.didProgress(event);
    };
    this.one('isAborting', () => xhr.abort());
      return xhr;
    },
    url,
    data,
    method
  }
}

但由于 ajaxSettings 的检索发生在默认值之后,因此在您的类的 ajaxSettings 对象中指定的与上述默认值重叠的任何属性都将优先并覆盖它们。

所以如果你在你的班级中定义了contentType'ajaxSettings,像这样:

ajaxSettings: computed('someProperty', function() {
  return {
    contentType: true, // (or some other value besides false)
    ...
  };
})

这将与上面默认值中指定的contentType: false 重叠,并且由于它会在默认值之后通过assign() 合并,因此优先。

【讨论】:

  • 感谢“计算”建议以及对我问题第二部分的出色回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 2021-04-06
  • 2023-03-22
  • 1970-01-01
  • 2019-01-19
相关资源
最近更新 更多