【问题标题】:Accessing observable variable before and after setting a value is not working在设置值之前和之后访问可观察变量不起作用
【发布时间】:2016-09-25 07:07:48
【问题描述】:

我有 2 个变量声明为 mtn 和 atn,它们的值是根据 API ajax 响应填充的。

现在,我正在为 mtn 和 atn 变量分配一个从 API 响应返回的值,在我的情况下,因为 mtn 为 null 而 atn 有一个 10 位数字。因此,我将 atn1、atn2、atn3 与 atn 的子字符串一起分配,而 mtn1、mtn2 和 mtn3 未触及,正如您从下面的代码 sn-p 中看到的那样。

var ViewModel = {
mtn: null,
atn: null,
mtn1: ko.observable(null),
mtn2: ko.observable(null),
mtn3: ko.observable(null),
atn1: ko.observable(null),
atn2: ko.observable(null),
atn3: ko.observable(null)
}
// Ajax API call happens and assigns ViewModel.mtn and ViewModel.atn
if (ViewModel.mtn != null && ViewModel.mtn.length == 10) { //This condition is not true because ViewModel.mtn is coming as null in case and so mtn1, mtn2 and mtn3 observables are untouched
ViewModel.mtn1 = ViewModel.mtn.substring(0, 3);
ViewModel.mtn2 = ViewModel.mtn.substring(3, 6);
ViewModel.mtn3 = ViewModel.mtn.substring(6, 10);
}
if (ViewModel.atn != null && ViewModel.atn.length == 10) {
ViewModel.atn1 = ViewModel.atn.substring(0, 3);
ViewModel.atn2 = ViewModel.atn.substring(3, 6);
ViewModel.atn3 = ViewModel.atn.substring(6, 10);
}
ko.applyBindings(ViewModel);

// Click event happens from View and Business logic UI validations take place below
processClick: function() {
     .var strmtn = ViewModel.mtn1 + ViewModel.mtn2 + ViewModel.mtn3; // This is not working and throwing error and only ViewModel.mtn1() is working
      var stratn = ViewModel.atn1 + ViewModel.atn2 + ViewModel.atn3; // This is working fine but ViewModel.atn1() is not working.

我相信以 ViewModel.atn1 访问 atn1 的方法有效而以 ViewModel.mtn1 访问 mtn1 的方法不起作用的原因是因为重新分配了 atn1 的 observable 而未触及 mtn1。

既然我不知道我的 observables 是否被触及,我怎么知道调用 observable 值的访问方法? :(

P.S:这个问题出现在我正在使用的 Knockout 3.x 版本中。我也刚刚添加了 2.x 版本。

【问题讨论】:

  • 这不是你设置或获取 observable 值的方式。在ViewModel.mtn1 = ViewModel.mtn.substring(0, 3) 行之后,mtn1 不再是 observable,而是常规字符串。

标签: knockout.js knockout-2.0 knockout-3.0


【解决方案1】:

observable 是一个 getter-setter 函数。要设置其内容,您可以这样做

ViewModel.mtn1(ViewModel.mtn.substring(0, 3));

要获取其内容,您可以这样做

value = ViewModel.mtn1();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多