javascript - 如何为 'extend' 提供动态值? (或 'how does extend work in this case' ?)

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

我正在查看一个 ( 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 如何到达函数内部并将扩展中提供的值合并到中的硬编码值中功能 ?

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


回应评论

最佳答案

  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 对象中指定的与上述默认值重叠的任何属性都将优先并覆盖它们。

因此,如果您在类的 ajaxSettings 中定义了 contentType,如下所示:

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

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

关于javascript - 如何为 'extend' 提供动态值? (或 'how does extend work in this case' ?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58828488/

相关文章:

Java - 强制子类在构造函数之后调用 super 方法

Java接口(interface)查询

javascript - Webpack 5 Assets 模块与 woff 文件有关

javascript - 当有嵌套 jQuery 调用时我可以获取 event.target

java - 将 Arraylist 与抽象对象转换

javascript - Ember 计算属性添加逗号

ember.js - EmberJS 实现多个嵌套的 Promise

javascript - Emberjs v4 无法复制对象

JavaScript 'new' 关键字