Javascript 无法读取未定义/敲除的属性x
我正在学习一个项目的KnockOut,我正在尝试绑定输入中的值,以将它们推送到editingUserList中。但是,我的绑定函数不起作用。似乎在它内部,editingUserList或其属性userKeyValues都无法识别。 每次错误无法读取未定义的属性x时,我都会得到Javascript 无法读取未定义/敲除的属性x,javascript,knockout.js,Javascript,Knockout.js,我正在学习一个项目的KnockOut,我正在尝试绑定输入中的值,以将它们推送到editingUserList中。但是,我的绑定函数不起作用。似乎在它内部,editingUserList或其属性userKeyValues都无法识别。 每次错误无法读取未定义的属性x时,我都会得到 $(function () { debugger; var keyValueModel = function (key, value) { var self = this; self.key = k
$(function () {
debugger;
var keyValueModel = function (key, value) {
var self = this;
self.key = ko.observable(key);
self.value = ko.observable(value);
}
var ConfidentialUsersListModel = function () {
var self = this;
self.userToAdd = ko.observable("");
self.editingUserList = {
userKeyValues: ko.observableArray([])
};
// (...)
};
// binding when a user is selected
$('#addUser').bind('typeahead:select', function (event, suggestion) {
var userNameValue = $('#addUser').val();
// pushing value
self.editingUserList.userKeyValues.push(new keyValueModel(userNameValue, userNameValue));
// adding initials of every user
// setUsersInitials($('.userAddedInitials'), 'userNameShare');
});
// apply the model defined above
ko.applyBindings(new ConfidentialUsersListModel());
})
因此,这里是视图的一部分:
<form>
<div class="shareSearchBar">
<i class="fa fa-search" aria-hidden="true"></i>
<input id="addUser" class="typeahead" placeholder="Ajouter un utilisateur" data-bind='value: userToAdd, valueUpdate: "keyup"' />
</div>
<!-- <select data-bind="options: userNameList" class="dropdown"></select>-->
</form>
你有什么想法吗?我可能误解了一些东西,并且已经在没有运气的情况下搜索了许多示例。。。非常感谢。
我以前也有过同样的问题。如果您显示所有javascript代码,我可以更好地评估问题。这些错误意味着对象具有未定义的变量x。先检查一下。下一步检查是否有承包商。如果你这样做了,那么把 itex上的绑定函数
function constructerExample() {
this.x = something;
this.functionName = function() {
this.x; // Javascript thinks this is refering to the functionName instead of the constructor
}.bind(this); // this bind function fixes it
jQuery处理程序不在viewModel的范围内,因此未定义self
var ConfidentialUsersListModel = function () {
var self = this;
// ...
// self goes out of scope at the end of this closure
};
$('#addUser').bind('typeahead:select', function (event, suggestion) {
// self does not exist here
self.editingUserList.userKeyValues.push(new keyValueModel(userNameValue, userNameValue));
});
将侦听器提升到viewModel中,以便它可以访问self
var ConfidentialUsersListModel = function () {
var self = this;
$('#addUser').bind('typeahead:select', function (event, suggestion) {
// self is still in scope
});
};
关于闭包/词法范围的进一步阅读:您的代码中似乎有一个错误-可能只是来自代码片段。在最后的第一节中,我们使用};}什么时候应该有};}我刚刚检查过-你是对的,语法在这里没有意义,但它是一个片段,例如,你真的应该尝试限制jquery和knockout-ISM的混合。在可能的情况下,您应该使用击倒方式,而不是尝试混合使用jquery事件处理。您真的应该在这里使用自定义绑定。我相信以前在这里有人问过这个问题,您可能会找到一个完整的实现。
var ConfidentialUsersListModel = function () {
var self = this;
$('#addUser').bind('typeahead:select', function (event, suggestion) {
// self is still in scope
});
};