0

私はこのビューを持っています:

<tbody data-bind="foreach: dataSource">
    <tr data-bind="if: Enabled && DefaultSupplier.Enabled">
        <td><input type="checkbox" data-bind="attr: { value: Id }, checked: $root.selectedIds" /></td>
        <td data-bind="text: Reference"></td>
        <td data-bind="text: Description"></td>
        <td data-bind="text: DefaultSupplier ? DefaultSupplier.Name.Name : ''"></td>
        <td data-bind="text: CurrentStock"></td>
    </tr>
</tbody>

最後のプロパティ はCurrentStock、AJAX 呼び出しを使用して取得する必要があります。

//know how many articles in stock
this.CurrentStock = ko.computed(function () {
    $.ajax({
        url: "/StockLines/GetArticleCurrentStock?ArticleId=" + { value: Id },
        method: "GET",
        dataType: 'json',
        success: function (data) {
            return data;
        }
    });
});

問題は、記事の ID がこのようなビューから取得できることです。

<td data-bind="text: Id"></td>

しかし、このようなパラメーターとして ajax 呼び出しに渡すことはできません{ value: Id }。これは動作しません。

私はKNOCKOUT全体に不慣れであり、非常に興奮しており、将来のプロジェクトでそれを使用する方法を学ぶことに興味があるため、助けていただければ幸いです.

4

4 に答える 4

1

getJson を使用してください。これでjsonオブジェクトを渡すことができます

$.getJSON( "/StockLines/GetArticleCurrentStock?ArticleId=", { value: Id } )
  .done(function( json ) {
    console.log( "success" );
  })
  .fail(function( jqxhr, textStatus, error ) {
    var err = textStatus + ", " + error;
    console.log( "Request Failed: " + err );
});

このコードに問題がある場合はお知らせください

于 2013-10-31T12:42:33.400 に答える
0

私は最終的に私のために働いた別のアプローチをしました。

意見

<h5>@ApplicationResources.Question_ShowOutOfStocks</h5><input type="checkbox" data-bind="checked: show" />

<!-- List of articles out of stock -->     
<table>
    <tbody data-bind="foreach: stocks, visible: show">
        <tr style="color: red">
            <td style="width: 3em">
                <input type="checkbox" data-bind="attr: { value: id }, checked: $root.selectedIds" />
            </td>
            <td data-bind="text: reference" style="width: 10%" ></td>
            <td data-bind="text: description" style="width: 35%" ></td>
            <td data-bind="text: supplier" ></td>
            <td data-bind="text: stock" ></td>
        </tr>
    </tbody>
</table>

ビューモデル

// Array of articles out of stock
self.stocks = ko.observableArray([]);

// Boolean show 
self.show = ko.observable(true);

// Stock ViewModel
function Stock(data) {
    this.id = ko.observable(data.id);
    this.reference = ko.observable(data.reference);
    this.description = ko.observable(data.description);
    this.supplier = ko.observable(data.supplier);
    this.stock = ko.observable(data.stock);
}

// Load data from server
$.getJSON("/Requests/GetOutOfStocks", function (allData) {
    var mappedTasks = $.map(allData, function (item) { return new Stock(item) });
    self.stocks(mappedTasks);
});

私の命を救ったので、これが他の誰かに役立つことを願っています!

于 2013-12-03T10:01:08.017 に答える
0

これは、オブザーバブルで ajax を使用することをお勧めする方法です ( fiddle: http://jsfiddle.net/jrhGg/1/ ):

html:

enter ID here: <input data-bind="value:ID"> <br />
click to talk to server:<button data-bind="click:send">send</button><br/>
status : <span data-bind="text:status"></span><br />
data from server: <span data-bind="text:dataFromServer"></span>

js:

var ajaxSimulation = function(dataToSend, callback){
    setTimeout(function(){
        callback("server says: you sent me: " + dataToSend);
    }, 2000);
}

var VM = function(){
    var self = this;
    self.ID = ko.observable();
    self.status = ko.observable("idle");
    self.send = function(){
        self.status("waiting for response from server");
        ajaxSimulation(self.ID(), function(dataFromServer){
            self.dataFromServer(dataFromServer);
            self.status("response from server received");
        })
    }
    self.dataFromServer = ko.observable();
}

ko.applyBindings(new VM());

サーバーとの通信中にアプリがまだ動作していることをユーザーに納得させるために、常にステータス ボックス (またはスピナー) を用意する必要があります。

于 2013-10-31T12:52:19.720 に答える