如何为“扩展”提供动态值? (或“在这种情况下如何扩展工作”?)

时间:2019-11-13 00:03:57

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

我正在看classthis 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);
  },

...我不确定我是否理解“扩展”是如何做的。 ajaxSettings用于ajax函数中,那么extend如何到达函数内并将合并扩展中提供的值合并到函数中的硬编码值中?

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


回应评论

1 个答案:

答案 0 :(得分:5)

  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' } }; }) }); 设为计算属性:
ajaxSettings
  1. 这确实是使用get(this, 'ajaxSettings') 属性的地方,代码的关键所在是这一行:
ajaxSettings

从类中检索ajaxSettings属性(因此,如果在基类上设置了{ 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 } } ,则您的子类将覆盖基类设置-有关更多信息,请参见here扩展。)

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

ajaxSettings

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

因此,如果您像这样在班级的ajaxSettings中定义了ajaxSettings: computed('someProperty', function() { return { contentType: true, // (or some other value besides false) ... }; })

contentType: false

这将与上面的默认值中指定的assign()重叠,并且由于它将在默认值之后通过{{1}}进行合并,因此它将具有优先权。