- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
-6ren">
这是带有数据绑定(bind)元素的 html:
div data-bind="foreach: clientRequests" id="test2">
<div class="list-group" >
<a href="#" class="list-group-item active"><b data-bind="text: client"></b></a>
<a href="#" class="list-group-item"><b>Priority: </b><b data-bind="text: client_priority"></b></a>
<a href="#" class="list-group-item"><b>Title: </b><b data-bind="text: title"></b></a>
<a href="#" class="list-group-item"><b>Description: </b><b data-bind="text: description"></b></a>
<a href="#" class="list-group-item"><b>Product Area: </b><b data-bind="text: product_area"></b></a>
<a href="#" class="list-group-item"><b>Target Date: </b><b data-bind="text: target_date"></b></a>
<a href="#" class="list-group-item"><b>Ticket URL: </b><b data-bind="text: ticket_url"></b></a>
</div>
</div>
这就是我将名为 requestsArray
的数组传递给 foreach
循环的方式:
ko.cleanNode(document.getElementById('test2'));
ko.applyBindings({
clientRequests: requestsArray
}, document.getElementById('test2'));
对于不同的 AJAX 调用,会返回不同的 requestArray。例如,在初始页面加载后,会进行 AJAX 调用,该调用接收 requestArray 的一个实例,该实例可能有 10 个项目。 foreach 循环的行为似乎符合预期,数组中的所有 10 个项目都填充在页面上。然后,进行第二次 AJAX 调用,但这次数组可能只有 5 个项目。所发生的情况是,每个项目重复两次,页面上总共出现 10 个项目。
问题似乎是,即使 ko.cleanNode(document.getElementById('test2'))
之前被调用过:
ko.applyBindings({
clientRequests: requestsArray
}, document.getElementById('test2'))
对于每个新数组,每次 foreach
迭代创建的 HTML 元素数量都会随着每个新数组而不断增加。使用 Vue.js,每次将新数组传递给数据绑定(bind)和 for 循环时,它本质上都是破坏性的,并且不会保留数组上一次迭代中的任何内容。
显然,在这种情况下使用 ko.cleanNode
不起作用,我知道 in the docs有一个示例确实执行了我认为正确的过程,但通过按钮和 self.array.remove(this) 一次只能处理一个 html 元素,我不太确定如何调整它以彻底清除从数组 foreach
迭代创建的所有 html 元素。
最佳答案
我不明白为什么您必须手动重新应用绑定(bind)。具有可观察数组的 View 模型的全部要点是, knockout 会为您处理数据更新...通常,当您使用 cleanNode
时,有一种更简单的方法来完成任务。
你尝试过这样的事情吗?
// Apply bindings _once_, viewmodel instance does not change
// in between requests
ko.applyBindings(new ViewModel());
function ViewModel() {
// Because the array is observable, knockout will
// monitor for changes and update the UI
this.requests = ko.observableArray([]);
// The view model has the request method
// the .done callback writes the results to the observable
// requests array
this.doRequest = function() {
mockupAjaxGetter().done(this.requests);
}.bind(this);
// Do an initial request
this.doRequest();
};
// Mockup code, just to produce some random numbers on a timeout
function mockupAjaxGetter() {
var randomResults = [];
for (var i = 0; i < Math.random() * 20; i += 1) {
randomResults.push(Math.random());
}
var cb;
var applyCb = function() {
if (cb) cb(randomResults);
}
setTimeout(applyCb, 500);
return {
done: function(fn) { cb = fn; }
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<ul data-bind="foreach: requests">
<li data-bind="text: $data"></li>
</ul>
<button data-bind="click: doRequest">New request</button>
关于javascript - 实现 Knockout.js 破坏性 foreach 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39990457/
这是一个假设性问题。如果我有来自 3 个单独的 sql db 查询的 3 个数组,这些查询都与另一个数组相关。例如…… //db schools id | school_name classes id
在我的应用程序中,我使用 scrape(string url) 方法从网页中抓取链接。可以说它每次都返回我 10 个 url。 我想从每个抓取的 url 中抓取 10 个链接。 长话短说: (第 1
我的java7代码: final Map result = new HashMap<>(); final Set> classes = getClasses(co.glue()); for (fina
是否可以在 SwiftUI 中设置变量,例如在这样的 ForEach 中: struct ContentView: View { var test: Int var body: som
在 D、int、uint 中使用 foreach 时,循环索引的首选类型是什么?或者只是通过省略类型自动实现? 最佳答案 一般来说,索引应该是size_t。与长度相同。如果您尝试使用 int 或 ui
根据 http://dlang.org/statement.html 的“Foreach 限制”部分以下代码 int[] a; int[] b; foreach (int i; a) { a
在什么情况下我们应该在 JDK 8 中使用旧的 foreach 循环遍历新的 collection.forEach() 还是最好的做法是转换 every foreach 循环?是否存在任何重要的性能差
获得类似东西的惯用方法是什么? ((fn [coll] (function-body)) [:a :b :c :d]) -> [[:a :b][:a :c][:a :d][:b :c][:b :d][
我正在创建一个基于 who is it? 的 Java 应用程序。现在我正在制作一种方法,在回答问题时我需要其他卡片。 我有两个列表: 列表是一个 ImageView 列表,其中我有卡片必须代表的 2
我希望有人能在我发疯之前帮助我。 我有 3 张 table : Table A SELECT companypk, companyname, logo, msscope FROM global_com
我正在尝试将多个字符串添加到 C# 中的 MailAddress。 如果我使用ForEach,我的代码会是这样 foreach (var item in GetPeopleList()
我没有太多的 C# 经验,所以如果有人能指出正确的方向,我将不胜感激。我有一个引用对象变量的 foreach 循环。我希望在主循环中创建另一个 foreach 循环,将当前变量与对象数组中的其余变量进
下面的代码每 60 秒删除文件夹“Images”中的文件,它可以工作,但是当文件夹为空时它会显示:警告:为 foreach() 提供的参数无效如果没有文件,如何解决这个问题,说“文件夹为空而不是那个警
我需要在两种不同的模式下运行,因此“if”(第二个稍后构建一个大的 csv) 下面对于单个实例运行正常,但在第二个 (*) 的加载时间上失败,因为在前 7k 行中的每一行上运行。 我想避免可怕的事情
我们可以使用以下两种方法实现类数组对象的迭代: let arrayLike = document.getElementsByClassName('dummy'); [].forEach.call(ar
我有这个代码 ... 它说: Attribute value invalid for tag forEach according to TLD 最佳答案 forEach标签不支持 valu
我在 SwiftUI 中有一个像这样的 ForEach: ForEach(entries) { (e: MyType) in NavigationLinkItem(entry: e) } 现在我
我无法在一个 Foreach 或 Foreach-Object 循环中使用多个命令 我的情况是—— 我有很多文本文件,大约 100 个。 所以他们被阅读 Get-ChildItem $FilePath
我必须从 json 文件(实际上是 2 个 json 文件)执行 ForEach,因此我执行 2 forEach,代码是 table { font-family: arial, sans-
我对编程很陌生,当我执行 forEach 函数时,我的应用程序返回错误。我的controller.js中有以下代码 $scope.ajaxRequest = A.Game.get({action: '
我是一名优秀的程序员,十分优秀!