如何在knockout viewmodels中处理ajax?

时间:2014-02-13 17:57:03

标签: javascript jquery knockout.js

我在项目中使用淘汰赛。我有多个viewmodel,每个viewmodel都有自己的save函数。现在每当用户点击保存按钮时,viewmodel数据发布到服务器,我想阻止保存按钮,直到响应从服务器返回。

目前我正在通过在每个视图模型中创建额外的可观察属性保存来处理此问题。因此,当用户点击保存按钮时,我将保存 observable设置为true,而在回调中我将其设置为false。我已使用敲除禁用绑定将该保存属性与该按钮绑定。

但我觉得这种方法并不好,它包含以下很大的缺点:

  1. 为此,我必须在每个视图模型中添加一个额外的属性。
  2. 我必须添加多行代码,例如将其设置为true并再次将其设置为false。
  3. 这种方法不是集中的,这种方法的代码是分散的。
  4. 所以我想知道有没有其他更好的方法来处理这个,一个插件或一些标准方式?

    修改

    为了澄清,我的问题与asp.net回发无关,问题是如何有效处理ajax,如阻止保存按钮,显示响应消息等  ??

3 个答案:

答案 0 :(得分:0)

这通常是使viewmodel成为viewmodel的原因。在像MVC这样的模式中,您的控制器不应该真正了解您的视图是什么样的,它具有什么控件,或状态是什么,并且您的模型仅包含要建模的视图的数据。在MVVM模式中,作为淘汰赛,您的viewModel实际上确实了解视图上控件的当前状态。这并不是说您的viewmodel应该直接更新视图,但它通常包含绑定到视图状态的属性。视频模型中接受SaveButtonEnabledIsSavingData甚至StatusLabelColor之类的内容。

答案 1 :(得分:0)

也许使用$。ajaxSetup()。您可以在文档就绪功能中调用它。

$.ajaxSetup({
    beforeSend: function(jqXHR) 
    {
        //this will be called before every 
        //ajax call in your program
        //so perhaps, increment an observable viewmodel variable
        //representing the number of outstanding requests
        //if this variable is > 0 then disable
        //your button
    },
    complete: function(jqXHR) 
    {
        //this will be called after every 
        //call returns
        //decrement your variable here
        //if variable is zero, then enable button
    }
}); 

答案 2 :(得分:0)

我建议你看看http://durandaljs.com/,一个使用Knockout的框架,并且有一些很好的数据模式,即使你不直接使用它。