2012-04-11 1 views
4

Я использую плагин сопоставления для создания модели просмотра на стороне клиента на основе объекта, который отправляется с сервера. Объект является базовой адресной информацией, то есть: address1, address2, city, state, postal, ect ...Как добавить вычисленное наблюдаемое на отображение knockoutjs

Как только модель просмотра привязана, я хочу, чтобы холст карт google обновлялся, если пользователь меняет адрес. Я создал вычисленный наблюдаемый, который проверяет введенные значения и вызывает функцию обновления карты. Я работал над этим раньше, когда я не использовал плагин сопоставления, то есть модель была определена локально, но как только я ввел отображение, мне не удалось добавить вычисленную наблюдаемую модель представления.

Я попытался выполнить инструкции из плагина сопоставления documentation, но вычисленный наблюдаемый не запускает обновления. У меня есть настраиваемое сопоставление, которое вызывает mapModel, который содержит вычисляемые наблюдаемые, как в примерах, но без обновлений.

Любые идеи?

$.getJSON("@Url.RouteUrl(" 
ContactUs_default ", new { action = " 
GetPageModel ", Model.BusinessID})", function(result) { 
    //create map property 
    result.Data.Map = null; 
    var mapping = { 
     'Map': { 
      create: function(options) { 
       return new mapModel(options.data); 
      } 
     } 
    }; 

    var viewModel = ko.mapping.fromJS(result.Data, mapping);  

    ko.applyBindings(viewModel); 

}); 

var mapModel = function(data) { 
    ko.mapping.fromJS(data, {}, this); 

    this.Map = ko.computed(function() { 
     var address = ""; 
     var enteredElements = 0; 

     if (this.Address1 != helpText) { 
      address += " " + this.Address1; 
      enteredElements++; 
     } 

     if (this.Address2 != helpText) { 
      address += " " + this.Address2; 
     } 

     if (this.City != helpText) { 
      address += " " + this.City; 
      enteredElements++; 
     } 

     if (this.State != helpText) { 
      address += " " + this.County; 
      enteredElements++; 
     } 

     if (this.PostalCode != helpText) { 
      address += " " + this.Postal; 
     } 
     alert("hi"); 

     //only upate map if enough data has been entered to give accruate location 
     if (enteredElements >= 3) { 
      MYMAP.placeMarkers(address); 
     } 
    }, this); 
};​ 

ответ

2

Когда вы отправляете свои данные через плагин сопоставления, все ваши свойства станут наблюдаемыми.

Это означает, что вам необходимо получить доступ к ним в качестве функции, как, как:

if (this.Address1() != helpText) { 
     address += " " + this.Address1(); 
     enteredElements++; 
    } 

Когда вы обращаетесь к ним наблюдаемым внутри вычисляемого наблюдаемых, то это создаст зависимость. Таким образом, в настоящее время ваш вычисленный наблюдаемый будет сначала оцениваться, но он никогда не обновится снова, так как он не получит доступ к значению любых наблюдаемых.

+0

Сделано это изменение, но теперь я получаю «Contact: 340Uncaught TypeError: Object [object Object] не имеет метода« Address1 »« ошибка, указывающая на вычисленное наблюдаемое. – Jerry

+0

Глядя на картуModel в отладчике chrome js, его свойствами являются «Карта» и «__ko_mapping__». Как получить доступ к другим свойствам модели, установленной плагином отображения? – Jerry

+2

Вот скрипка, которую вы можете изменить, чтобы продемонстрировать что-то ближе к вашему сценарию: http://jsfiddle.net/rniemeyer/RUsp2/. Я не уверен, что ваши данные выглядят точно. Похоже, что ваши данные результатов имеют свойство «Карта», но также и то, что вы создаете «Map», вычисленный как дочерний элемент. –