我正在查看一个类
( 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);
},
...我不确定我是否理解“扩展”是如何做它正在做的事情。 ajaxSettings
在 ajax
函数中使用,那么 extend
如何到达函数内部并将扩展中提供的值合并到中的硬编码值中功能 ?
希望这个问题是有道理的......如果你不写一本书就无法管理“第二”,我会很乐意回答“第一”;-)
回应评论
最佳答案
- 如果您想动态设置
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
属性的地方,关键代码行是这一行:
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/