Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法读取未定义/敲除的属性x_Javascript_Knockout.js - Fatal编程技术网

Javascript 无法读取未定义/敲除的属性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

我正在学习一个项目的KnockOut,我正在尝试绑定输入中的值,以将它们推送到editingUserList中。但是,我的绑定函数不起作用。似乎在它内部,editingUserList或其属性userKeyValues都无法识别。 每次错误无法读取未定义的属性x时,我都会得到

$(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
    });

  };