Asp.net mvc 3 是否可以使用ajaxpost设置一个与敲除相关的可观察对象

Asp.net mvc 3 是否可以使用ajaxpost设置一个与敲除相关的可观察对象,asp.net-mvc-3,knockout.js,Asp.net Mvc 3,Knockout.js,使用Knockout 2.0和MVC3 Razor表单,当我引入ajax方法时,我无法实现依赖的可观察性。我已经设置了一组作为计算一部分的观测值,当我返回这些观测值的乘积时,我能够设置一个带有正确结果的跨度标记。然而,当我尝试使用ajax方法来处理这些观察结果并返回结果时,我得到了不可预测的行为。首先,当输入字段被更新时,ajax POST似乎没有拾取其中一个可观察项(var b以0的形式发布到action方法,但最终被更新),然后,即使它的计算结果正确,我似乎也无法设置结果。看起来,Obser

使用Knockout 2.0和MVC3 Razor表单,当我引入ajax方法时,我无法实现依赖的可观察性。我已经设置了一组作为计算一部分的观测值,当我返回这些观测值的乘积时,我能够设置一个带有正确结果的跨度标记。然而,当我尝试使用ajax方法来处理这些观察结果并返回结果时,我得到了不可预测的行为。首先,当输入字段被更新时,ajax POST似乎没有拾取其中一个可观察项(var b以0的形式发布到action方法,但最终被更新),然后,即使它的计算结果正确,我似乎也无法设置结果。看起来,Observable或ajax调用都存在时间问题。尽管简单地用javascript执行计算效果很好,但我的目的是调用ajax方法来实现更复杂的逻辑。我已经从doc.ready()中删除了对ko.applybindings的调用,并将脚本方法移到了页面底部——这是我发现的使其部分功能化的唯一方法。我的viewModel设置如下:

var viewModel = {
    a: ko.observable(0),
    b: ko.observable(1),
    c: ko.observable(2),
    // commented this out, since
    // the dependent observable will handle this
    // d: ko.observable(0)
};
在我的独立观察中:

viewModel.d = ko.dependentObservable(function () {
    var theResult = 0;
    $('.theLabel').css("visibility", "visible");
    theResult=viewModel.a() * viewModel.b() * viewModel.c();
    // if we return here we get a valid result 
    return (theResult);

    // prefer to call ajax method
    // first check to ensure one variable is set
    if (viewModel.a() > 0) {
            $.ajax("/myCalculation/getResult", {
                data: ko.toJSON(viewModel),
                type: "post",
                context: viewModel,
                contentType: "application/json",
                success: function (result) {
                    // can't set visibility here
                    $('.theLabel').css("visibility", "visible");
                    // the POST does not pick up some observables, or
                    // does not the set dependent observable at all
                    return result;
                }
            });

        }
    });

你设置的函数有点错误

1.)在进行AJAX调用之前,您将从函数返回。return语句后面的代码永远不会执行

2.)即使省略了第一个return语句,AJAX调用也是异步的。。。这意味着它将在后台执行,并立即将控制返回到外部作用域。因为没有return语句,所以将返回undefined

3.)success回调中的注释表明您希望return语句一直传播到您的计算可观察对象return语句只作用于回调,而不作用于外部可观察对象。返回值将由jQuery使用,并且您的observable早就返回了

如果您希望一个可观察对象调用AJAX函数,则需要一个单独的值来存储异步调用的结果

以下是一个简化的示例:

var viewModel = function(){
   var $this = this;

   $this.a = ko.observable();
   $this.b = ko.observable();
   $this.results = ko.observable();

   //No need to assign this computed observable to a variable
   // because the results will be stored in '$this.results'
   // we just need this to handle the automatic updates
   ko.computed(function(){
      var data = {
         a: $this.a(),
         b: $this.b()
      };

      $.post("/do/some/stuff", data, function(results){
         $this.results(results);
      });
   });
};

谢谢没错,第一个return语句是为了说明我总是得到正确的结果(没有ajax)。关于success:method中的返回值,这是不正确的,但我以前曾尝试写入依赖的可观察对象(现在在2.0中计算),但我得到了一个错误,即您无法写入计算对象的值。奇怪,因为我一开始就是这么做的。你的回答对我来说已经足够了,但我仍然认为观测值是不同步的,因为我的模型正确地发布了一些值,但其他值却没有。