【问题标题】:knockout - cannot apply bindings multiple times to the same element淘汰赛 - 不能多次将绑定应用于同一个元素
【发布时间】:2016-04-29 13:51:26
【问题描述】:

我需要用来自两个来源的数据填充我的行程表:来自服务器在页面加载时使用 GET(以获取用户的存档行程)和来自可观察值(当用户添加新行程时)。我可以以某种方式合并这两个脚本,以便它们只应用一次绑定吗?现在我收到一个错误:您不能将绑定多次应用于同一个元素

<div class="panel panel-default">
  <div class="panel-heading">
    <h3 class="panel-title">Add a trip</h3>
  </div>
  <div class="panel-body">
    <div class="form-group">
        <label for="from">From</label> 
        <input type="text" class="form-control" id="from" name="from" placeholder="From" data-bind="value: from">
    </div>
    <div class="form-group">
        <label for="to">To</label> 
        <input type="text" class="form-control" id="to" name="to" placeholder="To" data-bind="value: to">
    </div>
    <a class="btn btn-primary btn-lg"  role="button" data-bind="click: add()" >Add</a>
  </div>
</div>


<div class="panel panel-default">
    <div class=panel-heading>Your trips</div>
    <table class=table>
        <thead>
            <tr>
                <th>From</th>
                <th>To</th>
            </tr>
        </thead>
        <tbody data-bind="foreach: records">
            <tr>
                <td data-bind="text: from"></td>
                <td data-bind="text: to"></td>
            </tr>
        </tbody>
    </table>
</div>


<script type="text/javascript" src="js/knockout-3.4.0.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>


<script type="text/javascript">
var AppViewModel = function() {
  this.from = ko.observable();
  this.to = ko.observable();
  this.records = ko.observableArray();

};
var model = new AppViewModel();


model.add = function() {
    model.records.push({ 
    from: model.from(),
    to: model.to()
  });


//sending data to server
   var data = 
            {
                from : this.from(), to : this.to(), date : this.date(),  price : this.price(), freeSeats : this.freeSeats()           
            }
            alert(data);

        $.post("/data", data, function(response)
        {

        })

}

ko.applyBindings(model);

</script>

<script>
    function tripModel() {
        this.records = ko.observableArray([]);

        $.getJSON("/usersTrips", function(data) {

          self.records(data);

        })
    }
    ko.applyBindings(new tripModel());
</script>

【问题讨论】:

  • 您的click 绑定应该是一个函数,而不是函数调用。

标签: javascript knockout.js


【解决方案1】:

提供相关元素的 ID,然后将模型仅应用于那些 DOM 元素。例如,

HTML:

<div id="add-trip" class="panel panel-default">

<div id="your-trips" class="panel panel-default">

还有绑定:

ko.applyBindings(model, document.getElementById("add-trip"));

ko.applyBindings(new tripModel(), document.getElementById("your-trips"));

JSFiddle 示例:

https://jsfiddle.net/hellobrett/49xaqj46/1/

JSFiddle 示例走向另一个方向:

https://jsfiddle.net/hellobrett/49xaqj46/2/

参考:

http://knockoutjs.com/documentation/observables.html

如果您想知道 ko.applyBindings 的参数是做什么的,

  • 第一个参数表示您要使用哪个视图模型对象来激活它的声明性绑定

  • (可选)您可以传递第二个参数来定义要在文档的哪个部分搜索数据绑定属性。例如,ko.applyBindings(myViewModel, document.getElementById('someElementId'))。这会将激活限制为 ID 为 someElementId 的元素及其后代,如果您希望拥有多个视图模型并将每个模型与页面的不同区域相关联,这将非常有用。

【讨论】:

  • 我想我不明白。如果我想为相同的元素应用模型,它会起作用吗?我有一张桌子,我想从 2 个来源绑定到这张桌子。那么如何将其划分为这 2 个“div”元素呢?
  • 您的代码有一些问题。请参阅我的答案中的 jsfiddle 示例。基本思想是您可以在脚本中引用这两个模型,但您只能将每个模型应用一次到任何给定的 DOM 元素。 jsfiddle.net/hellobrett/49xaqj46/1
  • 但我想将输入中的数据添加到表中。现在似乎反过来了,对吧?如何从输入绑定到表?
  • 好的,这是一个相反的例子;)jsfiddle.net/hellobrett/49xaqj46/2
猜你喜欢
  • 1970-01-01
  • 2017-05-05
  • 2014-10-21
  • 2015-01-06
  • 2020-12-09
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
相关资源
最近更新 更多