ko.computed 变量上定义的延迟计算的行为解释让我有点困惑。
这样的计算变量可以用属性 deferEvaluation: true 定义,它应该将评估推迟到任何其他属性要求变量值的那一刻(参见 http://knockoutjs.com/documentation/computed-reference.html ),
当常规 ko.computed 变量被 extend({deferred: true}) 扩展时,它异步调用计算并将其推迟到所有当前运行的“线程”完成(参见 http://knockoutjs.com/documentation/deferred-updates.html)。
这两个设置听起来很相似,但它们的作用完全不同。
任何人都可以向我确认我是对的,或者如果我弄错了可以解释一下区别吗?
最佳答案
deferEvaluation 只是延迟初始 评估。通常,当您创建一个计算对象时,它的求值器立即被同步调用,这意味着(除其他事项外)它所依赖的所有可观察对象都必须已经初始化。使用 deferEvaluation 可以防止这种情况发生,并使对计算函数的评估函数的第一次调用发生在第一次订阅计算函数时(或者永远不会,如果没有任何订阅)。之后,它没有进一步的影响;每当它依赖于任何变化时,计算仍然会立即重新评估。
.extend({deferred: true}) 是关于总是延迟执行求值器直到创建或更改它的任务完成之后(然后通常在下次 UI 更新)。这不仅仅是关于初始评估,这意味着每次计算的可观察量取决于变化时,通过使计算的评估异步(在当前任务之后)并等待它们稳定下来,允许这些变化得到解决。
这是一个片段,显示了两者都不使用,使用 deferEvaluation 和使用 .extend({deferred: true})。请注意调用评估程序时的差异。
setTimeout(function() {
console.log("---- Using neither:");
var ob1 = ko.observable(10);
console.log("creating c1");
var c1 = ko.computed(function() {
console.log("c1 evaluated");
return ob1() * 2;
});
console.log("Setting ob1 to 20");
ob1(20);
console.log("subscribing to c1");
c1.subscribe(function(newValue) {
console.log("c1's new value is " + newValue);
});
console.log("Setting ob1 to 30");
ob1(30);
console.log("Setting ob1 to 40");
ob1(40);
}, 50);
setTimeout(function() {
console.log("---- Using .extend({deferEvaluation: true}):");
var ob2 = ko.observable(10);
console.log("creating c2");
var c2 = ko.computed(function() {
console.log("c2 evaluated");
return ob2() * 2;
}, null, { deferEvaluation: true });
console.log("Setting ob2 to 20");
ob2(20);
console.log("subscribing to c2");
c2.subscribe(function(newValue) {
console.log("c2's new value is " + newValue);
});
console.log("Setting ob2 to 30");
ob2(30);
console.log("Setting ob2 to 40");
ob2(40);
}, 200);
setTimeout(function() {
console.log("---- Using .extend({deferred: true}):");
var ob3 = ko.observable(10);
console.log("creating c3");
var c3 = ko.computed(function() {
console.log("c3 evaluated");
return ob3() * 2;
}).extend({ deferred: true });
console.log("Setting ob3 to 20");
ob3(20);
console.log("subscribing to c3");
c3.subscribe(function(newValue) {
console.log("c3's new value is " + newValue);
});
console.log("Setting ob3 to 30");
ob3(30);
console.log("Setting ob3 to 40");
ob3(40);
}, 400);.as-console-wrapper {
max-height: 100% !important;
}<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"></script>
关于javascript - deferEvaluation 和 extend({deferred : true}),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41959826/
给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan
我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文
我有一个用Rails3编写的站点。我的帖子模型有一个名为“内容”的文本列。在帖子面板中,html表单使用tinymce将“content”列设置为textarea字段。在首页,因为使用了tinymce,post.html.erb的代码需要用这样的原始方法来实现。.好的,现在如果我关闭浏览器javascript,这个文本区域可以在没有tinymce的情况下输入,也许用户会输入任何xss,比如alert('xss');.我的前台会显示那个警告框。我尝试sanitize(@post.content)在posts_controller中,但sanitize方法将相互过滤tinymce样式。例如
我需要遍历数组并将提供的block应用于每个元素,并返回block返回的第一个真值,这意味着我需要在获得真值后立即停止。下面是我的代码。我是ruby新手,我不确定这段代码是否是在重新发明轮子。也许已经有一个或多个库方法可以做到这一点?还是可以简化此代码?RS={:x=>%w(\d+a\d+bb\d+ccc\d+).map{|x|/^#{x}$/},:y=>%w(\w+1\w+22\w+333\w+).map{|x|/^#{x}$/}}.freezedeffinds,tr=RS[s]ifrr.eachdo|p|m=p.matchtreturnmifmendnilendendpfind:x
出于某种原因,我必须为Firefox禁用javascript(手动,我们按照提到的步骤执行http://support.mozilla.org/en-US/kb/javascript-settings-for-interactive-web-pages#w_enabling-and-disabling-javascript)。使用Ruby的SeleniumWebDriver如何实现这一点? 最佳答案 是的,这是可能的。而是另一种方式。您首先需要查看链接Selenium::WebDriver::Firefox::Profile#[]=
我是Ruby和Watir-Webdriver的新手。我有一套用VBScript编写的站点自动化程序,我想将其转换为Ruby/Watir,因为我现在必须支持Firefox。我发现我真的很喜欢Ruby,而且我正在研究Watir,但我已经花了一周时间试图让Webdriver显示我的登录屏幕。该站点以带有“我同意”区域的“警告屏幕”开头。用户点击我同意并显示登录屏幕。我需要单击该区域以显示登录屏幕(这是同一页面,实际上是一个表单,只是隐藏了)。我整天都在用VBScript这样做:objExplorer.Document.GetElementsByTagName("area")(0).click
长话短说,我正在编写一个包含选项参数的方法,如果键的值:if评估为真,该方法将执行某些操作。当我使用新语法在IRB中尝试哈希时,我在IRB中遇到语法错误,提示保持打开状态:1.9.3p374:010>{if:true}1.9.3p374:011?>使用旧语法,效果很好:1.9.3p374:011>{:if=>true}=>{:if=>true}开始语句的所有关键字都表现出相同的行为。例如。def,do,module,case出现在中间和class中的其他保留字可以正常工作:else、end我的问题是:这是预期的行为、错误还是限制? 最佳答案
🎉精彩专栏推荐💭文末获取联系✍️作者简介:一个热爱把逻辑思维转变为代码的技术博主💂作者主页:【主页——🚀获取更多优质源码】🎓web前端期末大作业:【📚毕设项目精品实战案例(1000套)】🧡程序员有趣的告白方式:【💌HTML七夕情人节表白网页制作(110套)】🌎超炫酷的Echarts大屏可视化源码:【🔰Echarts大屏展示大数据平台可视化(150套)】🔖HTML+CSS+JS实例代码:【🗂️5000套HTML+CSS+JS实例代码(炫酷代码)继续更新中…】🎁免费且实用的WEB前端学习指南:【📂web前端零基础到高级学习视频教程120G干货分享】🥇关于作者:💬历任研发工程师,技术组长,教学总监;