2017-02-03 6 views
0

Извините за вопрос новичков, я работаю с KnockoutJS, и я пытаюсь получить значение base64String из наблюдаемого и хранить его внутри другого наблюдаемого перед его отправкой.Получить объект от KO.Observable

Зачем мне это нужно? Ну, по какой-то причине, когда base64String передается, он имеет несколько слоев для объекта, который отправляется через NULL.

Любая помощь или предложение будут оценены.

var CreateSalesVM = { 
    UserId: ko.observable(), 
    Name: ko.observable(), 
    Phone: ko.observable(), 
    Email: ko.observable(), 
    Item: ko.observable(), 
    Description: ko.observable() 

Эта часть того, что я имею вопрос с

IMAGETWO: ko.observable({ 
    base64StringArray: ko.observableArray() 
}), 
IMAGE: ko.computed({ 
    read: function() { 
     return IMAGETWO().base64StringArray(); 
    }, 
    deferEvaluation: true 
}), 

/************** \

btnCreateSales: function() { 
    // IMAGE = this.IMAGETWO().base64StringArray(); 
    console.log("Image text ", this.IMAGE()); 

    //console.log("Host usrl ", urlHostPath); 
    //console.log("Ko is ", ko.toJSON(this)); 
    $.ajax({ 
     url: urlPath, 
     type: 'post', 
     dataType: 'json', 
     data: ko.toJSON(this), 
     contentType: 'application/json', 
     success: function (result) { 
      //console.log("This was a success"); 
      // window.location.href = urlPath + '/'; 
      alert(ko.toJSON(this)); 
      // console.log("Ko is ", ko.toJSON(this)); 
     }, 
     error: function (err) { 

      //console.log("Ko is ", ko.toJSON(this)); 
      if (err.responseText == "success") 
      { 
       //console.log("This was an erro success", urlPath); 

       // window.location.href = urlPath + ''; 
      } 
      else { 
       alert(err.responseText); 
       // console.log("This was an error ", urlHostPath); 
      } 
     }, 
     complete: function() { 

     } 
    }); 
} 

}; 

ko.applyBindings(CreateSalesVM); 
+0

В чем проблема с существующим кодом? –

+0

Извините, выдает сообщение об ошибке - CreateVM.js: 26 Uncaught TypeError: IMAGETWO не является функцией – Dwill

ответ

2

IMAGETWO является метод вашего объекта VM. Вы должны указать объект во время вызова функции, иначе он будет выглядеть в глобальной области для него. Таким образом, вы можете использовать:

IMAGE: ko.computed({ 
    read: function() { 
     return this.IMAGETWO().base64StringArray(); 
    }, 
    deferEvaluation: true 
}, CreateSalesVM) 

или

IMAGE: ko.computed({ 
    read: function() { 
     return CreateSalesVM.IMAGETWO().base64StringArray(); 
    }, 
    deferEvaluation: true 
}) 
+0

Я не думаю, что либо работа с объектной нотацией –

+0

@ GôTô будет работать, CreateSalesVM уже определен? –

+0

@AdamWolski ah, право, я думал, что все это в одном блоке кода. Моя ошибка тогда –

0

Это терпит неудачу, потому что вы не указали на какой объект вызвать IMAGE (и по умолчанию он будет называться по window).

В модели IMAGE вашей модели просмотра пока нет, поскольку вы используете обозначение объекта.

Вы должны изменить способ определить вашу модель представления, от объекта к классу и добавить объект в IMAGETWO().base64StringArray(); следующим образом:

var CreateSalesVM = function() { 
    var self = this; 
    this.UserId = ko.observable(); 
    this.Name = ko.observable(); 
    this.Phone = ko.observable(); 
    this.Email = ko.observable(); 
    this.Item = ko.observable(); 
    this.Description = ko.observable(); 
    this.IMAGETWO = ko.observable({ 
     base64StringArray: ko.observableArray() 
    }); 
    this.IMAGE = ko.computed({ 
     read: function() { 
      return self.IMAGETWO().base64StringArray(); 
       //^^^^ note this 
     }, 
     deferEvaluation: true 
    }); 
} 
var myViewModel = new CreateSalesVM(); 
+0

Привет, это сработало, однако я мог бы узнать, отправить это в параметр данных ajax? – Dwill

0

Всякий раз, когда вы звоните ko.toJSON(), вы будете получите копию вашей виртуальной машины, сериализованной как JSON. В этом случае вам нужно разместить свой объект с помощью Аякса, все, что вам нужно сделать, это переопределить toJSON() функции для удаления свойства IMAGETWO и добавить IMAGE свойства с преобразованием (на базу 64) необходимо.

var CreateSalesVM = { 
    UserId: ko.observable(), 
    Name: ko.observable(), 
    Phone: ko.observable(), 
    Email: ko.observable(), 
    Item: ko.observable(), 
    Description: ko.observable(), 
    IMAGETWO: ko.observable({base64StringArray: ko.observableArray()}) 
} 


CreateSalesVM.prototype.toJSON = function() { 
    var copy = ko.toJS(this); // clean copy 
    copy.IMAGE = this.IMAGETWO().base64StringArray(); // create desired property to send 
    delete copy.IMAGETWO; //remove the undesired property 
    return copy; //return the copy 
}; 

Отъезд оригинального сообщения here.