我正在使用默认的 Durandal 设置构建一个 SPA 应用程序。我有多个使用 ajax 调用返回数据的视图,但是它不能正常工作。我创建了带有搜索框的 shell 页面,因此我可以搜索此处显示的员工列表。
Shell.js
define(['require', 'durandal/plugins/router', 'durandal/app', 'config'],
function (require, router, app, config) {
var shell = {
router: router,
searchData: searchData,
employees: ko.observable(),
search: search,
activate: activate,
};
var searchData = ko.observable('');
function search(searchData) {
var url = '#/employeeSearch/' + searchData.searchData;
router.navigateTo(url);
}
return shell;
function activate() {
router.map(config.routes);
return router.activate(config.startModule);
}
});
外壳.html
<div class="input-group">
<input type="text" class="form-control" placeholder="Search Employees" data-bind="value: searchData" />
<span class="input-group-btn">
<button type="submit" class="btn btn-default" data-bind="click: search">Search</button>
</span>
</div>
用户进行搜索,当他们单击搜索按钮时,下面的视图导航到employeeSearch 页面。这确实有效并返回数据并查看我需要的数据。
define(['require', 'durandal/plugins/router', 'durandal/app', 'config', 'services/logger'],
function(require, router, app, config, logger) {
var goBack = function() {
router.navigateBack();
};
function details(employee) {
var url = '#/employee/' + employee.Id + '/profile';
router.navigateTo(url);
}
var vm = {
goBack: goBack,
employees: ko.observable(),
details: details,
};
return {
activate: function (route) {
var self = this;
return self.getEmployees(route.q);
},
getEmployees: function (query) {
return $.ajax(app.url('/employees?q=' + query),
{
type: "GET",
contentType: 'application/json',
dataType: 'json',
}).then(querySucceeded).promise;
function querySucceeded(result) {
self.employees = result;
logger.log(query + ' Search Activated!', null, 'employeeSearch', true);
}
},
};
});
因此,如果我尝试搜索另一个名称,则 url 将导航,记录器将显示我搜索的值,但视图本身不会显示新结果。在 Chrome 调试器中探索,我查看了包含新结果集的员工对象,但该视图仍未更新。但是,如果我刷新页面,视图确实会正确显示我在这里查看了多个问题,这些问题与将数据调用保持在激活方法中的类似问题,确保数据在完成激活方法之前返回承诺,并进行 DOM 操作在视图中附加。 Javascript 未在我的 SPA 中呈现 如何在 Durandal 中使用 observables? HotTowel:在页面之间导航时 Viewmodel 丢失映射
将这些做法放入我的代码中后,我仍然无法正确更新视图。
我需要注意任何其他 Durandal/Knockout 属性吗?每次使用 (router.navigateTo(url);) 导航到视图时,如何更新绑定。我已将我的 shell 属性 (cacheViews: true) 设置为 true 和 false,但似乎没有任何改变。
这是我在使用 Durandal 构建 SPA 应用程序时遇到的众多问题之一。还在努力不放弃。