2

このエラー メッセージが表示されたまま、解決策が見つかりません。

Knockout JavaScript ライブラリ v2.2.0 で次のメッセージ エラーが表示されます。

localhost:port/Scripts/knockout-2.2.0.debug.js 0x800a138f の行 1053、列 5 で未処理の例外 - Microsoft JScript ランタイム エラー: 'in' へのオペランドが無効です: オブジェクトが必要です この例外のハンドラーがある場合、プログラムは安全に続行できます。

knockout-2.2.0.debug.js のこのコード行で停止します

 if ((initialValues !== null) && (initialValues !== undefined) && !('length' in initialValues)) 

私はこの WebApi を使用します:

public class ProductsController : ApiController
{
  IEnumerable<Product> products = new List<Product>() 
    { 
        new Product { Id = 1, Name = "Tomato_Soup", Category = "Groceries", Price = 1 }, 
        new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M }, 
        new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M } 
    };

      public IEnumerable<Product> GetAllProducts(){
            return products.AsEnumerable();    }

私が使用するスクリプトはヘッダーセクションにあります

@section Testscripts
{
    <script src="~/Scripts/jquery-1.8.2.js"></script>
    <script src="~/Scripts/knockout-2.2.0.debug.js"></script> 


}

そして、フッターのデフォルト スクリプト セクションの Knockout コード

@section scripts
{
    <script type="text/javascript">      
        var apiUrl = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "products" })';  

        function Product(data) {            
            this.Id = ko.observable(data.Id);
            this.Name = ko.observable(data.Name);
            this.Price = ko.observableArray(data.Price);
            this.Category = ko.observable(data.Category);

        }

        function ProductViewModel() {

            var self = this;
            self.myproducts = ko.observableArray([]);


        $.getJSON(apiUrl, function (allData) {
            var mappedProducts = $.map(allData, function (item) { return new Product(item) });

            self.myproducts(mappedProducts);

        });
      };
   ko.applyBindings(new ProductViewModel);
}

本文にデータを表示します。

<ul data-bind="foreach: myproducts">
    <li>
        <input data-bind="value: Id" />
        <input data-bind="value: Name" />
        <input data-bind="value: Category" />
        <input data-bind="value: Price" />
    </li>
</ul>
4

1 に答える 1

2

バグはあなたのProduct機能にあります。

値の配列ではなく 10 進数の値であるko.observableArrayfromを作成すると、このあまり良くない例外が発生します。data.Price

に変更するko.observableと、動作するはずです:

function Product(data) {            
        this.Id = ko.observable(data.Id);
        this.Name = ko.observable(data.Name);
        this.Price = ko.observable(data.Price);
        this.Category = ko.observable(data.Category);

    }
于 2012-11-20T08:19:15.273 に答える