【问题标题】:click not working for observable array element单击不适用于可观察的数组元素
【发布时间】:2019-04-26 00:30:00
【问题描述】:

我是淘汰新手并尝试构建一个简单的应用程序,我可以在其中动态添加数据行,但我不明白为什么当我删除 data-bind="click: remove" in remove buttondata-bind="click: remove" in remove button 无法正常工作@ 我的应用程序将正常工作,

如何使用删除按钮删除动态元素?

function people(name) {
    return {
        name: ko.observable(name),
        remove: function () {
            viewModal.peoples.remove(this);
        }
    };
}
var viewModal = {
    self: this,
    firstName: ko.observable(),
    peoples: ko.observableArray([
        { name: 'Franklin' },
        { name: 'Mario' },

    ]),
    addMore: function () {
        this.peoples.push(new people(this.firstName()));
    }
};
ko.applyBindings(viewModal);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="row">
    <div class="col-md-12">
        <div class="row">
            <div class="col-md-6">
                <input type="text" data-bind="value:firstName" />
            </div>
            <div class="col-md-2">

            </div>
        </div>

        <input type="button" value="Add People" data-bind="click:addMore" />
    </div>
    <div class="col-md-12" data-bind="foreach: peoples">
        <div class="row">
            <div class="col-md-6 form-group">
                <label data-bind="text:name"></label>
                <input class="form-control" type="text" />
            </div>
            <div class="col-md-6 form-group">
                <input type="button" class="btn btn-primary" value="remove" data-bind="click: remove" />
            </div>
        </div>
    </div>

</div>

【问题讨论】:

    标签: javascript jquery knockout.js


    【解决方案1】:

    编辑:正如 @GKB 在 cmets 中指出的那样,主要错误是最初的 people 对象缺少 remove 方法,结果我在此过程中已经修复了这个方法,而没有在我的答案中真正指出这一点。 .

    原答案:

    您不能像尝试过的那样使用this

    使用普通对象或new 类实例:

    工作示例:

    // Example 1: using plain objects
    function Person(name, app) {
      const self = {
        name: ko.observable(name),
        remove: () => app.people.remove(self)
      };
      
      return self;
    }
    
    // Example 2: using `new`
    var App = function() {
      const self = this;
        
      this.firstName = ko.observable(),
      this.people = ko.observableArray(
        [ "Franklin", "Mario" ].map(
          name => Person(name, self)
        )
      );
    };
    
    App.prototype.addPerson = function() {
      this.people.push(Person(this.firstName(), this));
      this.firstName("");
    };
    
    ko.applyBindings(new App());
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div class="row">
        <div class="col-md-12">
            <div class="row">
                <div class="col-md-6">
                    <input type="text" data-bind="value: firstName" />
                </div>
                <div class="col-md-2">
    
                </div>
            </div>
    
            <input type="button" value="Add People" data-bind="click: addPerson" />
        </div>
        <div class="col-md-12" data-bind="foreach: people">
            <div class="row">
                <div class="col-md-6 form-group">
                    <label data-bind="text:name"></label>
                    <input class="form-control" type="text" data-bind="textInput: name" />
                </div>
                <div class="col-md-6 form-group">
                    <input type="button" class="btn btn-primary" value="remove" data-bind="click: remove" />
                </div>
            </div>
        </div>
    
    </div>

    【讨论】:

    • 事实上,this 的工作方式与 OP 使用的方式相同。问题在于 peoples 可观察数组没有保存 people 对象的实例。相反,他们有匿名对象,这些对象上没有定义 remove 函数......这里小提琴jsfiddle.net/Lhjytgn8
    • 哎呀.. 我被this 的用法触发了,我只是不小心修复了实际错误...您想将其作为答案发布,还是我应该编辑我的?跨度>
    • [ "Franklin", "Mario" ].map(这是我犯错的地方吗?
    • 是的,正如@gkb 正确指出的那样,唯一的“真正”错误是您忘记将初始人员转换为Person 对象。
    • 非常感谢@gkb
    猜你喜欢
    • 2018-11-26
    • 2020-02-08
    • 2012-12-12
    • 1970-01-01
    • 2022-01-23
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    相关资源
    最近更新 更多