2017-02-03 7 views
0

初心者の質問に申し訳ありません。私はKnockoutJSで作業しています。私はobservableから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ああ、私はこれがすべて同じコードブロック内にあると思った。私の間違いは –

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(呼び出すたび)、あなたは'LL VMのコピーをJSONとしてシリアル化してください。あなたはAJAXを使用してオブジェクトを投稿する必要があり、この場合は、すべてあなたがしなければならないIMAGETWOプロパティを削除し、(ベース64に)変換してIMAGEプロパティを追加するtoJSON()関数をオーバーライドしています必要です。

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

関連する問題