Knockout JS:计算的observable无法更新

时间:2017-03-13 08:11:13

标签: knockout.js knockout-binding-handlers

我无法通过计算或pureComputed ko函数更新我的淘汰文本。

<li data-bind="css: { active: route().page === 'login'}">
    <a href="#"><label data-bind="text: logOption"></label></a>
</li>

var vm = {
    route: params.route,
    logOption: ko.pureComputed(function() {
       return userFunctions.isLoggedIn(session.user) ? "Log-out" : "Log-in";
      })
   }
  return vm;

绑定正在运行,但是当我登录或注销时它没有更新。

每当我点击元素时,先前的淘汰点击绑定都会更新,因此我知道userFunctions.isLoggedIn(sessions.user)本身会根据登录/注销状态自行更新。

我希望text:logOption更新为&#34;登录&#34;或&#34;退出&#34;取决于状态,但似乎淘汰赛没有观察到计算变量中userFunctions.isLoggedIn(sessions.user)状态的变化?

1 个答案:

答案 0 :(得分:1)

嗯,你的方法有很多问题。

首先,处理登录/注销不是客户端的责任。出于这个原因,它不应该是一个链接,而是一个POSTed表单,从那里开始这个过程。

关于您的特定问题,它不起作用,因为您使logOption依赖的值不是可观察的。 Knockout无法知道某事物的价值已发生变化,除非它是一个可观察的 - 换句话说,计算的可观察量并不像他们每隔0.x秒左右轮询一次价值以查看是否有变化一样。那么,您如何期望它意识到价值发生了变化?

因此,解决方案是您必须实现logOption值,以便它依赖于observable并更改它的值。这应该是其他类似情况下的解决方案,但就登录管理而言,您应该选择服务器端解决方案。