可观察到的更新时,所选选项不会更新,尽管optionsValue确实会更新

办公室

在以下代码中,产品(以表示productVM)具有可观察的属性(productName),其中包含以两种语言(英语和法语)表示的名称。

一旦cartItem加入,和产品选择,我希望按钮“更改语言”被点击时要更新其显示的名称(例如,如果“门”被选中,“改变语言”,然后点击,显示的名称应该是法语版本(这是英文单词加上法文后缀“ eux”)。

但这是行不通的:选项确实会更改,但是所选的选项已更改为标题选项。

需要更改/添加哪些内容以解决该问题?

var handlerVM = function () {
  var self = this;
  self.cartItems = ko.observableArray([]);
  self.availableProducts = ko.observableArray([]);
  self.language = ko.observable();
  self.init = function () {
    self.initProducts();
    self.language("english");
  }
  self.initProducts = function () {
    self.availableProducts.push(
      new productVM("Shelf", ['White', 'Brown']),
      new productVM("Door", ['Green', 'Blue', 'Pink']),
      new productVM("Window", ['Red', 'Orange'])
    );
  }
  self.getProducts = function () {
    return self.availableProducts;
  }
  self.getProductName = function (product) {
    if (product != undefined) {
      return self.language() == "english" ? 
        product.productName().english : product.productName().french;
    }
  }
  self.getProductColours = function (selectedProductName) {
    selectedProductName = selectedProductName();
    // if not caption
    if (selectedProductName) {
      var matched = ko.utils.arrayFirst(self.availableProducts(), function (product) {
        return (self.language() == "english" ? product.productName().english : product.productName().french) == selectedProductName;
      });
      return matched.availableColours;
    }
  }
  self.addCartItem = function (a, b, c, d) {
    self.cartItems.push(new cartItemVM());
  }
  self.changeLanguage = function () {
    self.language() == "english" ?
      self.language("french") :
      self.language("english");
  }
}
self.productVM = function (name, availableColours) {
  var self = this;
  self.productName = ko.observable({
  english: name,
  french: name + "eux",
  });
  self.availableColours = ko.observableArray(availableColours);
}
self.cartItemVM = function () {
  var self = this;
  self.cartItemName = ko.observable();
  self.cartItemColour = ko.observable();
}

var handler = new handlerVM();
handler.init();
ko.applyBindings(handler);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<div>
  <div data-bind="foreach: cartItems">
    <div>
      <select data-bind="options: $parent.getProducts(),
                optionsText: function (item) { return $parent.getProductName(item); },
                optionsValue: function (item) { return $parent.getProductName(item); },
                optionsCaption: 'Choose a product',
                value: cartItemName"
      >
      </select>
    </div>
    <div>
      <select data-bind="options: $parent.getProductColours(cartItemName),
                optionsText: $data,
                optionsCaption: 'Choose a colour',
                value: cartItemColour,
                visible: cartItemName() != undefined"
      >
      </select>
    </div>
  </div>
  <div>
    <button data-bind="text: 'add cart item', click: addCartItem" />
    <button data-bind="text: 'change language', click: changeLanguage" />
  </div>
</div>

用户名

当您更改options所选内容时,就会出现问题在更改期间,您的value可观察边界cartItemName包含英语字符串。例如:Door一旦您更改了语言,就不会再有一个语言option返回Door它的optionsValue表达,从而value彻底清除了。

最好的解决方案是存储对实际视图模型的引用,而不仅仅是其字符串名称。这确实需要您移动其他一些零碎的部分,因为您需要手动进行大量更新。

更改的起点:

// Remove
self.cartItemName = ko.observable(); 

// Add
self.cartItem = ko.observable();

// Change
<select data-bind="...
  value: cartItem
" />

在工作片段中,进行了一些其他更改,使我的工作更加轻松:

var handlerVM = function () {
  var self = this;

  self.cartItems = ko.observableArray([]);
  self.language = ko.observable("english");
  self.availableProducts = ko.observableArray([
    new productVM("Shelf", ['White', 'Brown']),
    new productVM("Door", ['Green', 'Blue', 'Pink']),
    new productVM("Window", ['Red', 'Orange'])
  ]);

  self.productNameFor = function(product) {
    return product.productName()[self.language()];
  };
  
  self.addCartItem = function (a, b, c, d) {
    self.cartItems.push(new cartItemVM());
  }
  
  self.changeLanguage = function () {
    self.language() == "english" ?
      self.language("french") :
      self.language("english");
  }
}
self.productVM = function (name, availableColours) {
  var self = this;
  self.productName = ko.observable({
    english: name,
    french: name + "eux",
  });
  self.availableColours = ko.observableArray(availableColours);
}

self.cartItemVM = function () {
  var self = this;
  self.cartItem = ko.observable();
  self.cartItemColour = ko.observable();
}

ko.applyBindings(new handlerVM());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<div>
  <div data-bind="foreach: cartItems">
    <div>
      <select data-bind="options: $root.availableProducts,
                optionsText: $root.productNameFor,
                optionsCaption: 'Choose a product',
                value: cartItem"
      >
      </select>
    </div>
    <div data-bind="with: cartItem">
      <select data-bind="options: availableColours,
                optionsCaption: 'Choose a colour',
                value: $parent.cartItemColour"
      >
      </select>
    </div>
  </div>
  <div>
    <button data-bind="text: 'add cart item', click: addCartItem" />
    <button data-bind="text: 'change language', click: changeLanguage" />
  </div>
</div>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

绑定为可观察到的敲除时如何更新ckeditor数据?

角度:绑定到服务的可观察属性->值不会更新

当使用SyncAdapter /其他线程更新时,LiveData不会观察到更改

更新MutableLiveData时观察到的抛出异常

任一可观察到的更新时触发代码

当数组开始为空时,可观察到的数组mobx不会更新

在地图上可观察到,以检测何时添加,更新删除的条目

ngIf块内部可观察到的角度rxjs错过了第一次更新

角度可观察不会自动更新

通过添加,过滤或删除项目来更新可观察到的Rxjs数组

变量更改后所选选项不会更新

更新可观察到的“ roles [0]未定义”时出错

淘汰赛-添加了可观察到的未在新对象上更新的功能

当儿童可观察到的更新时,淘汰赛js css似乎没有重新计算

可观察到淘汰赛-为什么此值会自动更新?

从敲除3.2中的自定义组件可观察到的更新

带有敲除的jQWidgets数字输入不会更新为可观察到的

可观察到淘汰赛更新

更新刷新功能中的可观察到的字符串

剔除js阻止可观察到的现有html更新

Angular2可观察到的变化检测模板更新

ComboBox不会更新所选项目

选择的下拉值更改时,可观察到的淘汰赛未更新

当其ViewModel可观察到的更改时,淘汰表组件视图未更新

可观察到的数据集未在模板中更新

当观察到的对象更改时,Swift View 不会更新

更新可观察集合时,Xamarin Forms Collectionview 不会更新

SwiftUI 观察到的对象未更新

角度可观察到仅使用页面上的多个组件更新其父订阅者