ember.js 如何为“extend”提供动态值?(或“extend在这种情况下如何工作”?)

9lowa7mx  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(109)

我在看一个classthis one)。它的文档建议你可以extend这个类来改变这个类的一个属性。这是真的,它对我很有效。
然而,我想做的是动态地提供设置的值。
我有两个问题

第一个

如何修改演示,以便动态提供所使用的值?

第二个

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

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);
  },

......我不确定自己是否理解“extend”是如何执行其当前操作的。ajaxSettingsajax函数中使用,那么extend如何到达该函数并将extend中提供的值合并到该函数中的硬编码值中呢?
希望这个问题有意义......如果你不写书就不能完成“第二”,我很乐意满足于“第一”的答案;- )
回应评论

yh2wf1be

yh2wf1be1#

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是在基类上设置的,则子类将覆盖基类设置--有关extends的更多信息,请参见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()合并,因此它将优先。

相关问题