我可以ko.observable会话变量吗?

时间:2016-01-19 22:10:04

标签: asp.net knockout.js

我有2个简单的aspx页面。在我的默认页面上,我有一个简单的标签,它使用ko.data绑定到Session变量。

我想如果我改变那个变量KnockoutJS会更新用户界面。当我点击sessionchanger页面上的按钮时,我改变了ko观察到的会话变量。我哪里做错了?

enter image description here

2 个答案:

答案 0 :(得分:2)

您必须更改status实例的viewModel属性的值,以反映对ui的更改。

var vm  =  new viwModel;
ko.applyBindings(vm);

vm.status('new value');

vm对象绑定到body而不是会话对象。您只需使用会话对象初始化vm.status属性。

因此,您无法在其他页面的vm.status中设置新值。 为了能够跟踪它,您应该使用客户端 - 服务器通信。它可以是AJAX,具有轮询功能或WebSocket。因此,您应该检查或监听服务器端,如果发生任何更改,您可以更新vm.status属性,之后它将反映您所期望的ui。

答案 1 :(得分:1)

你不能这样做,因为 asp.net渲染引擎只是传递Session["target"],而不是任何指向该变量的链接,你的淘汰代码也不是'写得很好,请参阅 @Viktor Kukurba 回答,以便更清楚地了解如何使用和应用数据绑定。

要获得所需的结果,您可以使用下列技术之一:

<强>优选

使用WebSockets通过“会话变更”页面通知“默认”页面关于更改会话变量的信息。 查看教程Building real-time web apps with WebSockets using IIS, ASP.NET and WCF,了解如何应用该技术。

解决方法

作为解决方法,您可以在应用后续步骤后与所需行为非常相似:

  1. 创建 asp.net http请求处理程序,该处理程序将以json格式返回Session["target"]的值。
  2. 创建javascript函数(让我们称之为refreshSessionTarger),它会向新创建的asp.net http处理程序发送AJAX请求并更新可观察变量的值(因此,淘汰将反映该更改,但是请注意,您必须正确添加ko数据绑定。
  3. 将步骤2中创建的refreshSessionTarger函数放入setInterval函数作为回调,并设置以毫秒refreshSessionTarger执行的频率间隔。

    function refreshSessionTarger(){
    // perform ajax request and update variable which holds session target
    };
    
    var delay = 5000;
    setInterval(refreshSessionTarger, delay)