在Knockout绑定数据之前查看渲染

时间:2013-04-23 04:55:17

标签: asp.net-mvc knockout.js breeze single-page-application durandal

我确信之前已经问过这个问题,但是我找不到了 - 任何帮助我指明正确方向的人都会非常感激。

我正在使用Durandal加载视图/视图模型,在激活方法期间,我要求获取单个记录然后显示。我正在获取记录(检查XHR响应并且所有数据都恢复正常)但我只能假设视图在数据准备好显示之前加载。没有JS错误,根本没有错误,但只是屏幕中间的一个大空白,即使我知道数据应该显示...

ViewModel:

define(['durandal/system', 'services/logger', 'services/datacontext'], function (system, logger, datacontext) {
    var aForm = ko.observable();
    var initialized = false;

    function activate(routeData) {
        var id = parseInt(routeData.id);
        return refresh(id);
    };

    function refresh(id) {
        return datacontext.getaFormById(id, aForm);
    }

    var vm = {
        activate: activate,
        aForm: aForm,
        title: "THE TITLE DISPLAYS JUST FINE"
    }
    return vm;
});

查看:

<h3 class="page-title" data-bind="text: title"></h3>

<div class="container-fluid" data-bind="with: aForm">
    <div class="row-fluid">
        <div class="span12">
            <strong>Testing</strong>
            <strong data-bind="text: id"></strong>        
        </div>
    </div>

    <h2 data-bind="text: description"></h2>
    <h2 data-bind="text: checkType().description"></h2>
</div>

我投入了强大的测试,它甚至没有渲染,只有标题。谁能指出我正确的方向?我会创建一个小提琴,但是当我在ViewModel中对数据进行硬编码时它会起作用。

编辑:

在深入挖掘它之后,我可能没有正确返回对象,特别是在data.entity返回类型中。这会导致这个问题吗?

    var getaFormById = function (aFormId, aFormObservable) {

        var query = EntityQuery.from('aForms')
            .where('id', '==', aFormId);

        return manager.executeQuery(query)
            .then(querySucceeded)
            .fail(queryFailed);

        function querySucceeded(data) {
            if (aObservable) {
                aObservable(data.entity);
            }
            logger.log('Retrieved selected [aForm] from remote data source', data, system.getModuleId(datacontext), true);
        }
    }

2 个答案:

答案 0 :(得分:1)

您未正确填写executeQuery成功回调中的observable,这就是为什么您的UI无法正确呈现的原因。

使用以下参数调用executeQuery documenation successFunction

  

successFunction([数据])

     
      
  • 数据对象   
        
    • 结果实体数组
    •   
    • ...
    •   
  •   

所以你需要从data.results数组中填充你的observable,而不是data.entity(只返回undefined):

if (aObservable) {
   aObservable(data.results[0]);
}

答案 1 :(得分:0)

你可以告诉Durandal通过从activate函数返回一个jQuery promise()来阻止绑定。

Ryan Keeter观看此视频作为解释:http://www.youtube.com/watch?v=w_XjWg6xL8I