充当KnockoutJS可观察对象
Function as a KnockoutJS observable
我有以下脚本(见下文(。我有两个问题:
1.在Knockoutjs的上下文中,下一行是什么意思?
ko.observable(null);
2.我如何调用一个尚未定义的函数:
that.activePollingXhr(...
以下是完整的脚本:
$(document).ready(function() {
function ChatViewModel() {
var that = this;
that.userName = ko.observable('');
that.chatContent = ko.observable('');
that.message = ko.observable('');
that.messageIndex = ko.observable(0);
that.activePollingXhr = ko.observable(null);
var keepPolling = false;
that.joinChat = function() {
if (that.userName().trim() != '') {
keepPolling = true;
pollForMessages();
}
}
function pollForMessages() {
if (!keepPolling) {
return;
}
var form = $("#joinChatForm");
that.activePollingXhr($.ajax({url: form.attr("action"), type: "GET", data: form.serialize(), cache: false,
success: function(messages) {
console.log(messages);
for (var i = 0; i < messages.length; i++) {
that.chatContent(that.chatContent() + messages[i] + "'n");
that.messageIndex(that.messageIndex() + 1);
}
},
error: function(xhr) {
if (xhr.statusText != "abort" && xhr.status != 503) {
resetUI();
console.error("Unable to retrieve chat messages. Chat ended.");
}
},
complete: pollForMessages
}));
$('#message').focus();
}
that.postMessage = function() {
if (that.message().trim() != '') {
var form = $("#postMessageForm");
$.ajax({url: form.attr("action"), type: "POST",
data: "message=[" + that.userName() + "] " + $("#postMessageForm input[name=message]").val(),
error: function(xhr) {
console.error("Error posting chat message: status=" + xhr.status + ", statusText=" + xhr.statusText);
}
});
that.message('');
}
}
that.leaveChat = function() {
that.activePollingXhr(null);
resetUI();
this.userName('');
}
function resetUI() {
keepPolling = false;
that.activePollingXhr(null);
that.message('');
that.messageIndex(0);
that.chatContent('');
}
}
//Activate knockout.js
ko.applyBindings(new ChatViewModel());
});
-
CCD_ 1创建具有值CCD_。没有什么不同于
ko.observable(5);
,其中的值将是5
。 -
我看到您通过向
that.activePollingXhr
传递ajax调用的结果来使用它。然而,这个调用是异步的,$.ajax
不会返回从服务器获得的数据,而是延迟的jquery。您需要在success
回调中使用that.activePollingXhr
。以下是您的代码可能的样子:$.ajax({url: form.attr("action"), type: "GET", data: form.serialize(), cache: false, success: function(messages) { console.log(messages); for (var i = 0; i < messages.length; i++) { that.chatContent(that.chatContent() + messages[i] + "'n"); that.messageIndex(that.messageIndex() + 1); } that.activePollingXhr(messages); // <-- Note where the call to activePollingXhr is }, error: function(xhr) { if (xhr.statusText != "abort" && xhr.status != 503) { resetUI(); console.error("Unable to retrieve chat messages. Chat ended."); } }, complete: pollForMessages });
关于你问题下的评论:that.activePollingXhr
被定义为ko.observable(null);
0——一个值为null
的可观测值。
这只是初始化一个以null
为初始值的可观察对象。
如果您需要调用一个可观察的函数,只需添加第二组括号即可。
that.activePollingXhr()()
相关文章:
- 将js对象更改为使用嵌套的可观察数组敲除js视图模型
- $scope$观察数组中的一个特定对象——Angular JS控制器
- 无法观察Ember.js中的对象数组
- 如何从具有动态可观察属性的淘汰对象中获取 JSON 字符串
- 培根.js Bus.plug: 未捕获 错误: 不是可观察的 : [对象对象]
- 使用rxjs创建一个可观察的对象,该对象稍后将连接到web套接字
- 将$scope对象作为参数提供给$digest中的观察者背后的逻辑
- Knockoutjs当父对象's可观察到的变化
- 在ko.applyBindings(..)中执行Knockout js订阅函数(用于可观察对象)
- 聚合物通过父对象观察子属性
- Knockoutjs观察嵌套对象并订阅更改
- Knockout.js用单个json对象绑定一个可观察对象
- 使用AngularJS观察整个对象(深度观察)
- 无限循环当观察父对象时,观察者不更新任何值
- 向KO传递在对象内可观察到的计算值
- 根据某些条件将 JS 绑定到可观察对象内的数组元素
- 如何从下拉列表中由可观察数组填充的选定项中检索完整对象
- 如何创建挖空可观察数组/对象的深层副本
- 对象.观察顺序
- 对象.观察同步回调