javascript - 如果 Knockout pureCompulated 包含可能并不总是存在的可观察值,它可以工作吗?

标签 javascript knockout.js

很抱歉,如果问题措辞不当。

我的问题是,我想更改基于 pureCompulated 的元素样式,但计算包含一个可观察量,在构造组件时该可观察量可能并不总是存在,因为该可观察量来自不同的组件并且该组件可能不会提前构建。

所以我目前有这样的东西,我希望它足够但不起作用:

this.thingRunning = ko.pureComputed(function() {
    if(app.thing){
        return app.thing.running();
    }else{
        return false
    }
}, this);

所以问题是,如果app.thing最初是未定义的,那么这个计算总是返回falseapp.thing 最终会被定义,只是不是在计算之前,所以我希望计算结果在定义时能够返回 true。

我知道这可能是我的应用程序一般设置方式的问题,但我只是想知道是否有一种简单的方法可以解决这个问题,而我却错过了,因为我对 Knockout 和 JavaScript 仍然是一个菜鸟。一般。

最佳答案

是的,绝对可以!

但是,按照目前的结构,您可能不会像您期望的那样得到重新评估。

更好的方法是:

this.thingRunning = ko.pureComputed(function() {
    var app = ko.unwrap(app) || {},
        thing = ko.unwrap(app.thing) || {},
        running = ko.unwrap(thing.running);

    return ((typeof running == 'undefined' || running === null) ? false : running);
}, this);

使用这种形式,pureCompulated的依赖关系非常清晰。更重要的是,它们已正确注册,只要这三个更改中的任何一个(并且是可订阅的形式之一),那么这个 pureCompulated 将重新评估。它的优点是可以安全地导航可能不存在的值。

这是一个完整的示例:

function vm(){
	var self = this;
  
  self.thing = ko.observable({
  	running: ko.observable(true)
  });
};

function otherVm(appModel){
	var self = this;
  
  self.appModel = appModel;
  
  self.thingRunning = ko.pureComputed(function(){
  	var app = ko.unwrap(self.appModel) || {},
    		thing = ko.unwrap(app.thing) || {},
        running = ko.unwrap(thing.running);
        
    return ((typeof running == 'undefined' || running === null) ? false : running);
  });
};

var app = new vm(); //try commenting this out
var other = new otherVm();

console.log(ko.unwrap(other.thingRunning));

关于javascript - 如果 Knockout pureCompulated 包含可能并不总是存在的可观察值,它可以工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45838387/

相关文章:

javascript - Jquery each 和 Selector 的行为不同

javascript - jQuery scrollTop 如果 URL 有散列

javascript - 显示不同的图像 react

javascript - Knoucktout.js中select2可见绑定(bind)只显示不隐藏

data-binding - 如何对 iframe src 属性进行数据绑定(bind)?

knockout.js - 将输入元素的值作为参数传递给 View 模型函数

javascript - 如何以编程方式更改 jquerymobile 页面并将数据发送到该页面?

javascript - 将上传的图片 url 传递给 javascript

javascript - 如何正确通知我的 observablearray 刷新它在 knockoutjs 中的 View ?

javascript - 您可以修改可观察数组中的多个实体,但让 Knockout 仅触发一个更改通知吗?