Knockoutjsobservable和jQuery扩展了函数
Knockoutjs observable and jQuery extends function
假设我有以下代码:
var Klass = function(){
var self = this;
this.value = 123;
this.update = function(){
$.ajax({
url: '/whatever',
async: false,
success: function(data){
$.extend(self, data);
}
});
}
}
让我们假设,'/whatch'返回这个json对象:
{value: 234}
当我这样做的时候:
var obj = new Klass();
obj = ko.mapping.fromJS(obj);
console.log(obj);
我们都知道obj
现在是一个可以观察到的敲除js。
我运行这个:
obj.update();
console.log(obj);
我发现,obj
的值并没有被重写为一个简单的值234,而是保持为一个可观察的属性。
我的问题是:
1) 为什么会这样?
2) 我如何使更新按我的意愿工作。
更新:ajax调用不是异步的。
第一个问题是您正在扩展self
,它是一个作用域变量,只存在于Klass函数内部,而不是您通过调用它创建的实例。
如果在调用update
时需要覆盖value
,则需要调用$.extend(this, data);
。尽管我确实理解你为什么在那里使用self
。但是通过调用ko.mapping.fromJS
添加的observable
功能随后丢失。CCD_ 10不再是函数(ko observable
)而是标量值(234
)。您必须再次调用obj = ko.mapping.fromJS(obj);
才能将值包装为observable
。
第二个问题是$.get
是异步的,所以在调用obj.update
之后立即调用console.log(obj)
将在GET响应到来之前记录该值。您需要等待它执行(使用回调)。
这是一把正在工作的小提琴。
var Klass = function(){
this.value = 123;
this.update = function(callback){
var self = this;
$.get('/', function(data) {
$.extend(self, {value: 234});
callback.call(undefined);
});
}
}
var obj = new Klass();
obj = ko.mapping.fromJS(obj);
console.log(obj.value());
obj.update(function() {
obj = ko.mapping.fromJS(obj);
console.log(obj.value());
});
相关文章:
- Node.js v6.2.0类扩展不是函数错误
- 从Chrome扩展名中的popup.html文件在background.js文件中运行一个函数
- 扩展自容器函数Javascript
- 为什么我需要为扩展函数设置构造函数
- 使用默认函数扩展 JavaScript 对象
- 使用 jQuery animate 函数扩展内容区域
- 使用自定义绑定、扩展器或自定义函数扩展挖空
- 将 onclick 函数扩展到 javascript 类
- JavaScript REGEX 使用自定义函数扩展 '/pattern/'
- 使用自定义函数扩展should.js
- 用成员函数扩展React.js存储数据结构
- 用修改后的.click函数扩展jQuery
- jQuery使用相同的函数扩展多个对象
- 使用自己的逻辑/旁路构造函数扩展库
- 将javascript函数扩展到动态加载的文件中
- 如何从另一个函数扩展被调用的回调
- javascript.对象函数扩展的原型
- jQuery函数扩展的作用域问题
- 添加函数扩展JavaScript
- 哈希值由某个函数扩展