我正在尝试按照给出的示例在 Durandal 文档中创建一个模块,位于此处:http ://durandaljs.com/documentation/Creating-A-Module/
我无法弄清楚为什么我的 promise 对象没有更新我的 observable 数组。这是我到目前为止所拥有的:
main.js
requirejs.config({
paths: {
'text': 'durandal/amd/text'
},
urlArgs: "bust=" + (new Date()).getTime() //this is a cache buster for js, remove before deployment
});
define(['durandal/app', 'durandal/viewLocator', 'durandal/system', 'durandal/plugins/router', 'lib/utils', 'lib/config', 'lib/backend'],
function(app, viewLocator, system, router, utils, config, backend) {
system.debug(true);
var Backend = backend;
window.service = new Backend(config.service_url);
app.title = 'Huddle';
app.start().then(function() {
viewLocator.useConvention();
router.useConvention();
router.mapRoute('projects', 'viewmodels/projects/list', 'Projects', true);
app.adaptToDevice();
app.setRoot('viewmodels/shell', 'entrance');
});
});
视图模型/项目/list.js
define(function (){
return {
projects: ko.observableArray([]),
activate: function () {
var self = this;
return service.getProjects().then( function ( jqxhr ){
self.projects(jqxhr);
});
}
};
});
意见/项目/list.html
<section class="projects-list" data-bind="widget: { kind: 'sortable_table', items: projects }">
库/后端.js
define(function(require){
var backend = function (service_url) {
this.url = service_url;
};
backend.prototype.getProjects = function(){
var jqxhr = $.getJSON(this.url+'/projects');
return jqxhr;
};
return backend;
});
服务呼叫响应
{
"projects": [
{
"id": <project id>,
"title": "Project One",
"description":"This is a description",
"created_by": <user_id>,
"created_date": "12341234",
"modified_by": <user_id>,
"modified_date": "12341234",
"favorite": true,
"users": [
<user id>,
<user id>,
<user id>
]
},
{
"id": <project id>,
"title": "Project Two",
"description":"This is a description",
"created_by": <user_id>,
"created_date": "12341234",
"modified_by": <user_id>,
"modified_date": "12341234",
"modified_by": 394839248239,
"favorite": true,
"users": [
<user id>,
<user id>,
<user id>
],
"favorite": true
},
{
"id": <project id>,
"title": "Project Three",
"description":"This is a description",
"created_by": <user_id>,
"created_date": "12341234",
"modified_by": <user_id>,
"modified_date": "12341234",
"favorite": true,
"users": [
<user id>,
<user id>,
<user id>
]
}
],
"archived_project_count": 10
}
我注意到后端完成的服务调用已成功完成(通过查看我在 Chome Inspector 中的网络选项卡),但它似乎没有在then
调用的块中运行任何内容viewmodels/projects/list.js
(通过添加 console.log 进行了测试( “我在这里”)行之前self.projects(jqxhr)
。我尝试更改then
为done
,但仍然没有。相反,我在控制台中看到 jqxhr 对象,然后是“取消导航”。
作为旁注,我还想知道 Durandal 中是否有更好的约定来使 main.js 中的变量集在整个应用程序中都可以访问。到目前为止,我不得不使用window.service = [Object]
,但似乎应该有另一种方法可用。我正在考虑尝试像在 main.js 中使用 utils 和 config 一样设置后端,但我首先需要一个配置值来创建后端,所以我认为这不是一个选项。
任何帮助是极大的赞赏!