1

我正在尝试按照给出的示例在 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)。我尝试更改thendone,但仍然没有。相反,我在控制台中看到 jqxhr 对象,然后是“取消导航”。

作为旁注,我还想知道 Durandal 中是否有更好的约定来使 main.js 中的变量集在整个应用程序中都可以访问。到目前为止,我不得不使用window.service = [Object],但似乎应该有另一种方法可用。我正在考虑尝试像在 main.js 中使用 utils 和 config 一样设置后端,但我首先需要一个配置值来创建后端,所以我认为这不是一个选项。

任何帮助是极大的赞赏!

4

1 回答 1

0

弄清楚这里发生了什么:我收到的 JSON 无效,所以then不会触发。意识到这一点是有帮助的,知道无效的 JSON 不会触发错误。原因是:<user id>像这样的属性实际上是以这种方式发送的,而不是作为数字给出的。哎呀!

于 2013-06-09T06:18:49.917 回答