Наблюдаемые коллекции вложенных массивов не работают в нокауте - PullRequest
1 голос
/ 14 января 2012

У меня есть список компаний, при нажатии на каждую компанию нужно показать продавцам этой компании.

Я пытался нокаутом для этого.ниже приведен скрипт, и все, что вы можете найти в http://jsfiddle.net/habdulha/gkqeD/29/

Первоначальная компания указана в списке, но при нажатии на компанию продавцы не загружаются.

<!-- language: lang-js -->

var rootViewModel = function(companies) {
this.companiesModel = ko.observableArray(companies);
}

var companyModel = function(salesPersonModel) {
CompanyId = ko.observable();
Name = ko.observable();
SalesPersonList = ko.observableArray(salesPersonModel);
LoadSalesPerson = function() {

    var self = this;
    var postData = {
        companyId: this.CompanyId()
    }
    /// ajax to get the emp name based on company id
    var data = $.ajax({
        type: 'GET',
        url: '/echo/json/',
        data: postData,
        success: function(result) {
            /// result is based on companyid
            var ajaxReply = {
                "empName": "John",
                "empName": "John 1"
            };


            self.SalesPersonList = ko.observableArray(ko.mapping.fromJS(ajaxReply)());


        },
        error: function(xhr, ajaxOptions, thrownError) {
            alert(xhr.status);
            alert(thrownError);
        }
    });
    }
  }

 var salesModel = function() {
  empName = ko.observable();
 }


  var myCompanyModelArray = new Array();
  var mySalesModelArray = new Array();
  mySalesModelArray[0] = new salesModel();
  myCompanyModelArray[0] = new companyModel(mySalesModelArray);
  var mainViewModel = new rootViewModel(myCompanyModelArray);
  ko.applyBindings(mainViewModel);

  $(document).ready(function() {
      var data = $.ajax({
      type: 'GET',
      url: '/echo/json/',
      //// get all the companies
      success: function(data) {
        var ajaxReply = {
            {
                "CompanyId ": "1",
                "Name ": "Comp 1"
            }, {
                "CompanyId ": "2",
                "Name ": "Comp 2"
            }
        };
        residencyViewModel.yearGroupModel(ko.mapping.fromJS(ajaxReply)());

    },
    error: function(xhr, ajaxOptions, thrownError) {
        alert(xhr.status);
        alert(thrownError);
    }
   });

  });

Ответы [ 2 ]

1 голос
/ 17 января 2012

У меня была та же проблема, но ответ @ ColinE не работал для меня, но идея была правильной ...

В моем случае я получаю список элементов в виде JSON и добавляю их в наблюдаемыймассив после сопоставления.

$.getJSON("/Path/To/Json/Service", function (r) {

    self.SalesPersonList.removeAll();

    // loop through each item returned
    $.each(r, function (i, v) {
        // add a mapped item to the array
        self.SalesPersonList.push(ko.mapping.fromJS(v)); 
    });

});
1 голос
/ 14 января 2012

Проблема в этой строке кода:

self.SalesPersonList = ko.observableArray(ko.mapping.fromJS(ajaxReply)());

SalesPersonList - это наблюдаемый массив, поэтому, когда он привязан к вашему пользовательскому интерфейсу, Konckout будет наблюдать за массивом на предмет изменений. В приведенном выше коде вы просто заменяете свой массив новым экземпляром. Для этого вам нужно заменить содержимое массива, привязанного к вашему интерфейсу, а не заменять сам массив ...

self.SalesPersonList.RemoveAll();
for(var item in ko.mapping.fromJS(ajaxReply)()) {
  self.SalesPersonList.push(item);
}
...