【发布时间】:2013-08-10 22:32:00
【问题描述】:
所以我已经来回讨论了很长时间了,所以我会直奔主题。
我正在创建一个基于 HotTowel 模板的应用程序,所以我使用了敲除、微风、Q 等。我使用微风查询从服务器获取一些数据,然后我将这些数据加载到第一个选择(作为选项)。这会更改 selectedModel 可观察对象和订阅触发器(订阅是当前的“解决方案”,我使用了数据绑定等,结果相同)。然后订阅获取新的 selectedModel 值并使用它来获取第二个 observable 的数据。该查询也会通过,结果存储在 modelProperties 可观察数组中,但 UI 不会更新第二个选择(它是空的)。奇怪的是,按 ctrl + F5(我连续尝试了大约 50 次)总是能正确填充它,但永远不会在第一次加载时。
TLDR; 2 选择,第一个选择的选项定义了对第二个选项的查询。查询有效,可观察对象被填充,第一次选择总是被填充,第二次永远不会在第一次启动时,但总是在下面的 ctrl+F5 上。
以下是有关此应用程序的一些 sn-ps: 视图模型:
define(['services/logger', 'services/datacontext'], function (logger, datacontext) {
var models = ko.observableArray();
var modelProperties = ko.observableArray();
var selectedModel = ko.observable();
var init = true;
function activate() {
logger.log('Search View Activated', null, 'search', true);
return datacontext.getModels(models);
}
var sub = selectedModel.subscribe(function (newValue) {
return datacontext.getModelProperties(modelProperties, newValue);
});
var vm = {
activate: activate,
models: models,
selectedModel: selectedModel,
modelProperties: modelProperties,
title: 'Search View'
};
return vm;
视图的代码:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body id="one">
<select id="entitySelect" class ="entitySelect" name="first"
data-bind="options: models, value: selectedModel">
</select>
<select id="propertySelect" class ="propertySelect" data-bind=
'options:modelProperties'></select>
</body>
</html>
以及datacontext中的方法:
var getModels = function (modelsObservable) {
var query = EntityQuery.from('Models');
return manager.executeQuery(query)
.then(querySucceeded)
.fail(queryFailed);
function querySucceeded(data) {
logger.log("Query succeeded", true);
logger.log(data);
if (modelsObservable) {
modelsObservable(data.results);
}
logger.log('Retrieved [Models] from remote data source',
data, true);
}
function queryFailed(data) {
logger.log(data.toString(), data, true);
}
};
var getModelProperties = function (propertiesObservable,modelName) {
var query = EntityQuery.from('ModelProperties').withParameters({ name: modelName });
return manager.executeQuery(query)
.then(querySucceeded)
.fail(queryFailed);
function querySucceeded(data) {
logger.log("Query succeeded", null, true);
logger.log(data);
if (propertiesObservable) {
propertiesObservable(data.results);
}
logger.log('Retrieved [Properties] from remote data source',
data, true);
}
function queryFailed(data) {
logger.log(data.toString(), data, true);
}
};
我想再次指出,所有查询都通过了,并且 observableArrays 确实填充了结果(使用 .peek() 检查)。
这里有一些截图可以澄清问题: 从 VS 首次启动时: http://i.imgur.com/8Gd53Yh.png
然后,ctrl+F5 http://i.imgur.com/vzO8d70.png
我已经尝试了几乎所有我能想到的东西,并在谷歌上搜索了所有想到的东西,但无济于事。任何帮助将不胜感激!另外,这是我第一次在这里发帖,如有错误,我深表歉意!
【问题讨论】:
标签: javascript knockout.js breeze