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

这是有据可查的。看看https://github.com/incredibleweb/knockout.async

进行异步请求时,计算出的 observable 将在 AJAX 请求完成之前返回;因此导致它失败。但是有一个解决方法。

于 2015-03-20T16:12:47.610 回答
0

这就是我建议您在可观察对象中使用 ajax 的方式(小提琴: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 回答
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 回答