【问题标题】:Knockout bootstrap modal issue淘汰赛引导模式问题
【发布时间】:2014-03-31 05:36:45
【问题描述】:

我尝试自己编写一个 Knockout 应用程序,其中包含可用的嵌套数组。 我正在尝试创建一个引导模式窗口,它将帮助我添加一个新的嵌入式列表项。 我创建了所有内容,但不幸的是,新项目总是添加到最后一个数组中。 知道我做错了什么吗?

我现在写的可以在JSFiddle上找到 JS

ko.bindingHandlers.showModal = {
         init: function (element, valueAccessor) {
             $(element).modal({ backdrop: 'static', keyboard: true, show: false });
         },
         update: function (element, valueAccessor) {
 
             var value = valueAccessor();
             if (ko.utils.unwrapObservable(value)) {
                  $(element).modal('show');
                 $("input", element).focus();
             }
             else {
 
                 $(element).modal('hide');
             }
         }
     };
 
 
function Task(data) {
   this.family = ko.observable(data.family); }
 
var personModel = function() {  self = this;    self.people =
ko.observableArray([
       new testModel("Person",["one","two","three"]),
       new testModel("Person2",["one2","two2","three2"]),
       new testModel("Person3",["one3","two3","three3"])
]); }
 
function TaskItem(data) {
     this.family = ko.observable(data); 
}
 
var testModel = function(name,children){
 
   self = this;
   self.itemToAdd = ko.observable("");
   self.name = name;
   self.items = ko.observableArray([]);

   for(var i = 0; i<children.length;i++){
      self.items.push(new TaskItem(children[i]));
   }
 
   self.currentItem = ko.observable();
   self.newTaskText = ko.observable();
   self.displaySubmitModal = ko.observable(false);
   self.showModal = function(){
       self.displaySubmitModal(true);
   };
   self.closeSubmitModal = function(){
       self.displaySubmitModal(false);
       self.newTaskText("");
   };
 
   // Operations
   self.addTask = function() {
       self.items.push(new Task({ family: this.newTaskText() }));
       self.newTaskText("");
       self.displaySubmitModal(false);
   }; 
}
 
ko.applyBindings(new personModel());

和 HTML

<ul data-bind="foreach: people">
        <li>
            <div>
                <span data-bind="text: name">has <span data-bind='text: items().length'>&nbsp;</span>
                    children: </span>
                <ul data-bind="foreach: items">
                    <li><span href="#" data-bind="text: family"></span></li>
                </ul>



                <a href="#" data-bind="click: showModal">Add new Item</a>
                <div id="modalNew" class="modal hide fade" data-bind="showModal:displaySubmitModal()">
                    <div class="modal-header">
                        <button type="button" class="close" data-bind="click: closeSubmitModal" data-dismiss="modal"
                            aria-hidden="true">
                            &times;</button>
                        <h3>
                            My Editor</h3>
                    </div>
                    <div class="modal-body">
                        Add task:
                        <input data-bind="value: newTaskText" placeholder="What needs to be done?" />
                    </div>
                    <div class="modal-footer">
                        <a href="#" class="btn btn-primary" data-bind="click: addTask">Add Note</a> <a href="#"
                            class="btn" data-bind="click: closeSubmitModal" data-dismiss="modal">Close</a></div>
                </div>
            </div>
        </li>
    </ul>

编辑

经过多次尝试,它没有t work. I dont 知道我做错了什么以及如何解决它。 我观察到的是“添加新项目”总是我为(Person 3)加载最后一个模态窗口。即使我删除了其余的 Modals 并只留下了第一个,新项目正在为第三人添加。

这就是我要问的原因:

是否可以创建具有“添加新项目”按钮的嵌套数组,该按钮将打开一个模态窗口(twitter-bootstrap),其中包含新项目的所有字段并将该项目添加到选定的数组中?

【问题讨论】:

  • “可能重复”不是重复的。有两个不同的问题。就像我写的那样,我已经有一个模态视图,但总是在最后一个数组中添加新项目
  • 我想知道问题是否是因为您在 foreach:people 循环中定义了模式。这意味着您正在为三个具有相同 id 的模式生成 HTML。不确定 jQuery 将如何处理在文档中显示 3 次的模式。也许它总是显示最后一个,这可以解释为什么你总是看到最后一个显示。
  • 我也想知道。之后,我使第一个仅可见,但该项目再次添加到最后一个数组中。我m almost sure that thats 为什么我有这个问题,但问题是如何创建一个唯一的模式,它将为所有数组加载

标签: twitter-bootstrap knockout.js


【解决方案1】:

您的代码几乎可以工作了。

但是有一个 javascript 问题,全局变量污染,这会阻止它工作。

修复了你的 jsfiddle:http://jsfiddle.net/63tGP/3/

解决了

self = this;

var self = this;

self = this;window.self = this; 相同

最后,你的 addTask() 中的 self 总是指向最后一个 testModel。

【讨论】:

  • 谢谢@huocp :) 我已经修复了它,但我没有时间添加答案。我会检查您的帖子,例如答案,然后添加我的解决方案。问候
  • 好发现! "use strict"; 在这里会有所帮助。
【解决方案2】:

以前我已经找到了解决方案。

我在 googlegroups 上写了我的问题,一个人更新了我的 jsFiddle。

他添加了一个具有启发性的模块模式。

如果有人对我们的讨论感兴趣here is a link to it

还有我的更新jsFiddle

ko.bindingHandlers.showModal = {
         init: function (element, valueAccessor) {
             $(element).modal({ backdrop: 'static', keyboard: true, show: false });
         },
         update: function (element, valueAccessor) {

             var value = valueAccessor();
             if (ko.utils.unwrapObservable(valueAccessor())) {
                  $(element).modal('show');
                 $("input", element).focus();
             }
             else {

                 $(element).modal('hide');
             }
         }
     };


var Task = function(data) {
   var family = ko.observable(data.family);
    return { family: family};
}

var personModel = function() {  
    var people = ko.observableArray([
       new testModel("Person",["one","two","three"]),
       new testModel("Person2",["one2","two2","three2"]),
       new testModel("Person3",["one3","two3","three3"])
       ]);
    return {
             people: people
            };
};

var TaskItem = function(data) {
     var family = ko.observable(data); 
    return { family: family};
}

var testModel = function(familyName,children){
   var itemToAdd = ko.observable("");
   var name = familyName;
   var items = ko.observableArray([]);

   for(var i = 0; i<children.length;i++){
      items.push(new TaskItem(children[i]));
   }

   var currentItem = ko.observable();
   var newTaskText = ko.observable();
   var displaySubmitModal = ko.observable(false);
   var showModal = function(){
       displaySubmitModal(true);
   };
   var closeSubmitModal = function(){
       displaySubmitModal(false);
       newTaskText("");
   };

   // Operations
   var addTask = function() {
       items.push(new Task({ family: newTaskText() }));
       newTaskText("");
       displaySubmitModal(false);
   }; 

    return {
        items: items,
        showModal: showModal,
        displaySubmitModal: displaySubmitModal,
        closeSubmitModal: closeSubmitModal,
        name: name,
        newTaskText: newTaskText,
        addTask: addTask,

    };
}

ko.applyBindings(new personModel());

问候

【讨论】:

    猜你喜欢
    • 2013-01-23
    • 2015-03-24
    • 2015-03-30
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 2014-07-13
    相关资源
    最近更新 更多