2013-03-26 2 views
0

Когда я Добавить карту на мой взгляд, я называю это:Сохранение не работает с нокаутом viewModel?

innerModel.addCard = function() { 
       // This just adds a card to the UI 
       var card = new cardViewModel(addCardDto); 
       innerModel.cards.push(card); 
      }.bind(this); 

Это добавляет пустую карту в пользовательский интерфейс и позволяет вводимые пользователем данные некоторую информацию. Когда они нажимают «Сохранить», я отправляю этот пакет с минимальным минимальным размером по кабелю, сохраняя его на сервере, а затем возвращаю более полный объект. то же самое касается обновления - я отправляю только то, что нужно, и возвращаю полный объект. Вот мой cardViewModel:

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

     self.isNew = ko.observable(false); 

     // If the card hasn't been created yet, it won't have a cardId 
     if (typeof this.cardId === 'undefined') { 
      this.isNew(true); 
     } 

     this.save = function() { 
      // Implement API call here, one for POST, one for PUT. For now: 
      // Currently just using a hard-coded piece of data 'cardDto' that mocks the result of an API call 
      var result = new cardViewModel(cardDto); // Problem is somewhere around here 
      result.editing(false); 
      result.isNew(false); 
      debugger; 
      // trying to re-assign the object to the result here, but it's not working. No errors from javascript, just no activity when I click "save". 
      self = result; 
     }; 

    }; 

С моей точки зрения я:

<a data-bind="click: save">save</a> 

Это работал раньше, когда мой метод сохранения был только это:

this.save = function() { 
       // Implement API call here, one for POST, one for PUT. For now: 
       this.editing(false); 
       this.isNew(false); 
    }; 

Что я делаю неправильно?

Я попытался это:

this.save = function() { 
      // Implement API call here, one for POST, one for PUT. For now: 
      // Currently just using a hard-coded piece of data 'cardDto' that mocks the result of an API call 
      var result = new cardViewModel(cardDto); // Problem is somewhere around here 
      result.editing(false); 
      result.isNew(false); 
      debugger; 
      // trying to re-assign the object to the result here, but it's not working. No errors from javascript, just no activity when I click "save". 

      ko.mapping.fromJS(result, {}, self); // NEW 
     }; 

Но хром умирает без каких-либо ошибок или что-нибудь, когда я запускаю это, он просто говорит: «Опаньки».

Редактировать: Я работал в IE и получаю «размер стека вызовов превышен». Копаем в него сейчас ...

ответ

2

self = result переназначает переменную self, чтобы не привести к тому, что объект обновил себя или какие-либо его свойства. Нет ничего особенного в self, который изменит работу JS.

Просто позвоните ko.mapping.fromJS(result, {}, this), чтобы обновить объект.

+0

Еще раз спасибо за помощь. Я пробовал это (но с ko.mappingfromJS (resullt, {}, self), и хром просто умирает, когда я запускаю его с сообщением «Aw snap» - нет ошибок js. Любая идея, почему это происходит? – SB2055

+0

Выяснил это - «result» должен был быть «cardDto» в последнем вызове сопоставления, пока я имитирую. Я проходил в новом setViewModel. – SB2055