首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在页面加载时执行的Knockout计算

在页面加载时执行的Knockout计算
EN

Stack Overflow用户
提问于 2017-04-06 17:26:45
回答 2查看 461关注 0票数 1

基本上,我有一个下拉选择,将有另一个下拉加载。我有一个根据第一个下拉选择的值计算的变量(我知道它可以订阅,但仍然可以)。但是计算的结果是在页面加载时执行的,这是我不想要的,因为里面有一个AJAX调用。‘页面加载时执行的原因是什么?如何避免这种情况?

HTML:

代码语言:javascript
复制
<div>
  <select id="selectmenu1" data-bind="options: departments, 
             optionsValue: 'id', 
             optionsText: 'name', 
             optionsCaption: 'Choose...',value: selectedDept">
  </select>
  <select id="selectmenu1" data-bind="options: contacts, 
             optionsValue: 'id', 
             optionsText: 'name', 
             optionsCaption: 'Choose...'">
  </select>
</div>

和JS

代码语言:javascript
复制
// Here's my data model
var ViewModel = function(first, last) {
  var self = this;
  var deptArray = [];
  var deptObj = {
    id: "8888",
    name: "Electrical"
  };
  deptArray[0] = deptObj;
  deptObj = {
    id: "9999",
    name: "Admin"
  };
  deptArray[1] = deptObj;
  self.departments = ko.observableArray(deptArray);
  self.selectedDept = ko.observable();
  self.contacts = ko.observableArray();
  self.contactsRetrieve = ko.computed(function() {
    var deptId = self.selectedDept();
    console.log("entered");
    $.ajax({
      url: '/echo/js',
      complete: function(response) {
        console.log("success");
        var contactArray = [];
        var contactObj = {};
        if (deptId == '8888') {
          contactObj.id = '1234';
          contactObj.name = 'Vivek';
        } else if (deptId == '9999') {
          contactObj.id = '5678';
          contactObj.name = 'Sree';
        }
        contactArray[0] = contactObj;
        self.contacts(contactArray);
      }
    });
    console.log("exited");
  });
};

ko.applyBindings(new ViewModel());

https://jsfiddle.net/jtjozkax/37/

EN

回答 2

Stack Overflow用户

发布于 2017-04-06 17:32:00

据我所知,导致这种行为的不是页面加载本身,而是计算的可观察对象依赖于其他可观察对象的事实,在您的例子中是self.selectedDept。Knockout发现计算依赖于哪些其他可观察对象,实际上是selectedDept的值的更改导致计算结果重新计算。

您无法避免这种行为,但是可以通过添加保护条件(读取:if语句)来避免执行AJAX调用。我假设您的目标是在下拉列表中没有选择任何内容的情况下阻止AJAX调用,毕竟,这是实现这一目标的最直接的方法。

没有其他方法可以绕过它,原因很简单,如果你想一想,计算机的整个目的就是在任何其他可观察到的东西依赖于变化时重新评估自己,而不需要人工干预。

票数 0
EN

Stack Overflow用户

发布于 2017-04-07 16:11:52

代码语言:javascript
复制
if(!self.selectedDept()){return}

如果未选择任何选项,则使用此if语句取消计算中的功能。

https://jsfiddle.net/jtjozkax/38/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43251043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档