【问题标题】:Knockout observableArray not updating JQuery Accordion淘汰 observableArray 不更新 JQuery Accordion
【发布时间】:2014-03-29 09:29:30
【问题描述】:

我已将我的网站更新为最新的 JQuery、JQueryUI 和 KnockOutJS。

从那时起,当我将项目添加到可观察数组时,我的手风琴拒绝更新。在将 KnocKOutJS 2.0.0 版与旧版本的 JQuery 一起使用时,这工作得很好。

我已经在 J​​SFiddler 中重现了这个问题,希望能得到任何帮助。 javascript 是我实际代码的高度简化版本。

http://jsfiddle.net/glenb/M9222/6/

任何帮助将不胜感激。 我的模型如下所示:

function ModelCollection() {
   var self = this;
   self.ModelItems = ko.observableArray([]);

   self.AddNewItem = function(){
      var newItem = new ModelItem();
      newItem.Name = "Added";
      modelCollectionApp.ModelItems.push(newItem);
  };
}

function ModelItem() {
   var self = this;
   self.Name = "";
}

HTML:

<div id="knockOutBinding">
   <div data-bind="foreach: ModelItems, jqAccordion: {}">
      <h3>An Element Title</h3>
      <div>Some Content</div>
   </div>
   <button data-bind="click: AddNewItem">Add New Item</button>
</div>

最后我最初填充并绑定它

var modelCollectionApp = new ModelCollection();

var modelItem = new ModelItem();
modelItem.Name = "test1";
modelCollectionApp.ModelItems.push(modelItem);

var modelItem = new ModelItem();
modelItem.Name = "test2";
modelCollectionApp.ModelItems.push(modelItem);

ko.applyBindings(modelCollectionApp, document.getElementById("knockOutBinding"));

【问题讨论】:

  • 你试过knockout-jQuery修复吗? - gvas.github.io/knockout-jqueryui/index.html
  • 感谢您的链接,但是当我使用该库时,我得到:“消息:您不能将绑定多次应用于同一元素。”我不认为它与 ko foreach (
    ) 配合得很好。
  • 对不起,还没有尝试过手风琴,但我设法让它与标签一起使用。我试图让它在你的小提琴中工作,但没有运气,并决定用谷歌搜索它。在 stackoverflow 上找到有同样问题的人:stackoverflow.com/questions/19210897/…
  • 谢谢,我终于从淘汰赛中找到了一些帮助,贴在下面!

标签: jquery jquery-ui knockout.js jquery-ui-accordion knockout-3.0


【解决方案1】:

事实证明,关于版本 3 中的 JQueryUI 小部件和淘汰赛,情况发生了巨大变化。

埃文在这里解释https://groups.google.com/forum/#!searchin/knockoutjs/accordion/knockoutjs/OX6Lp_I_LoY/472sLkF5MTcJ

底线是在我的代码中绑定手风琴时:

<div data-bind="foreach: ModelItems, jqAccordion: {collapsible: true}">

之前,您需要传入“{collapsible: true}”之类的配置选项。这在旧版本中有效,但现在已经改变。您应该改为传入“ViewModel”。

<div data-bind="foreach: ModelItems, jqAccordion: ModelItems">

需要改变的另一件事是你必须调用 ko.unwrap 的更新方法

var options = valueAccessor();
ko.unwrap(options)  // <-- this is important!

如果你想自定义手风琴,你必须在绑定的 init 部分这样做:

init: function (element, valueAccessor) {
   var options = {
      collapsible: true,
      active: false,
      animate: "easeOutQuint",
      heightStyle: "content"
   };

   $(element).accordion(options);
   $(element).bind("valueChanged", function () {
      ko.bindingHandlers.jqAccordion.update(element, valueAccessor);
   });
}

这里是更新的 JSFiddle http://jsfiddle.net/glenb/M9222/7/

我希望这对那里的人有所帮助,如果对你有帮助,请点赞!

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签