Knockout.js 使用databind foreach的Durandal observablearray绑定问题

Knockout.js 使用databind foreach的Durandal observablearray绑定问题,knockout.js,durandal,single-page-application,observable,Knockout.js,Durandal,Single Page Application,Observable,我刚开始学习Durandal,遇到了一个与observablearray绑定的问题 我可以确认数组中有数据,因为我可以手动弹出数据并渲染它。但是,当我尝试使用foreach数据绑定列出数据时,数据不会被呈现 有人能帮忙吗?我不确定为什么通过databind foreach进行的渲染失败。。。。先谢谢你 以下是视图的代码: <section class="view"> <header> <button class="btn btn-info btn-force

我刚开始学习Durandal,遇到了一个与observablearray绑定的问题

我可以确认数组中有数据,因为我可以手动弹出数据并渲染它。但是,当我尝试使用foreach数据绑定列出数据时,数据不会被呈现

有人能帮忙吗?我不确定为什么通过databind foreach进行的渲染失败。。。。先谢谢你

以下是视图的代码:

<section class="view">
<header>
    <button class="btn btn-info btn-force-refresh pull-right" 
        data-bind="click: refresh"><i class="icon-refresh"></i> Refresh</button>
    <h3 class="page-title" data-bind="text: title"></h3>
    <div class="article-counter">
        <address data-bind="text: speakers().length"></address>
        <address>found</address>            
    </div>


</header>
<!--Manual Pop to confirm we have data!-->
<section>
    <article class="article-container-full-width">
        <div>
            <img data-bind="attr: { src: speakers().pop().imageName() }" class="img-polaroid"/>
            <address data-bind="text: speakers().pop().firstName()"></address>
            <address data-bind="text: speakers().pop().lastName()"></address>
        </div>    
    </article>
</section>
<!--data bind for each, this is not working!-->
<section data-bind="foreach: speakers" class="view-list">
    <article class="article-container-full-width">
        <div>
            <img data-bind="attr: {src: imageName}" class="img-polaroid"/>
            <address data-bind="text: firstName"></address>
            <address data-bind="text: lastName"></address>
        </div>    
    </article>
</section>
}))

数据服务的代码:

define(['logger', 'durandal/system', 'model'],
function (logger, system, model) {

var getSpeakersPartials = function(speakersObservable) {
    // reset the observable
    speakersObservable([]);

    // set ajax call
    var options = {
        url: '/api/speakers',
        type: 'GET',
        dataType: 'json'
    };

    // make call
    return $.ajax(options)
        .then(querySucceeded)
        .fail(queryFailed);

    // handle the ajax callback
    function querySucceeded(data) {
        var speakers = [];
        data.sort(sortSpeakers);
        for (i = 0; i < 6; i++) {
            var item = data[i];
            var speaker = new model.SpeakerPartial(item);
            speakers.push(speaker);
        }
        speakersObservable(speakers);
        log('Retrieved speaker partials from remote data source',
            speakers,
            true);
    }

};

var dataservice = {
    getSpeakersPartials: getSpeakersPartials
};
return dataservice;

//#region Internal methods
function sortSpeakers(s1, s2) {
    return(s1.firstName + s1.lastName > s2.firstName + s2.lastName)
        ? 1 : -1;
}


function queryFailed(jqXHR, textStatus) {
    var msg = 'Error getting data. ' + textStatus;
    logger.log(msg,
        jqXHR,
        system.getModuleId(dataservice),
        true);
}

function log(msg, data, showToast) {
    logger.log(msg,
        data,
        system.getModuleId(dataservice),
        showToast);
}
//#endregion
定义(['logger','durandal/system','model'],
功能(记录器、系统、型号){
var getSpeakersPartials=函数(speakersObservable){
//重置可观察到的
可观察的说话者([]);
//设置ajax调用
变量选项={
url:“/api/speakers”,
键入:“GET”,
数据类型:“json”
};
//打电话
返回$.ajax(选项)
.然后(查询成功)
。失败(查询失败);
//处理ajax回调
函数查询成功(数据){
变量=[];
数据排序(排序器);
对于(i=0;i<6;i++){
var项目=数据[i];
var扬声器=新型号。扬声器部分(项目);
扬声器。推(扬声器);
}
可观察的说话人(说话人);
日志('从远程数据源检索到的扬声器部分',
发言者,
正确的);
}
};
var数据服务={
GetSpeakerPartials:GetSpeakerPartials
};
返回数据服务;
//#区域内部方法
功能排序扬声器(s1、s2){
返回(s1.firstName+s1.lastName>s2.firstName+s2.lastName)
? 1 : -1;
}
函数查询失败(jqXHR,textStatus){
var msg='获取数据时出错。'+textStatus;
logger.log(msg,
jqXHR,
system.getModuleId(数据服务),
正确的);
}
函数日志(消息、数据、showToast){
logger.log(msg,
数据,
system.getModuleId(数据服务),
展示土司);
}
//#端区

}))

你在用微风吗?然后尝试添加括号,如工作示例中所示,看看这是否适用于foreach块。最近有一条关于类似行为的线索,但到目前为止没有最终答案。speakers()的值是多少。输出的长度是多少?当检索到数据时,记录器在数据服务中记录了什么?@RainerAtSpirit,据我所知,我没有使用breeze,但是在这一点上,我愿意尝试任何东西。@Hans,vale of speakers()。length返回一个值。它返回一个整数值6。唯一的think I日志是它是否成功地从控制器检索数据。您还可以在getSpeakerPartials方法(ajax调用的成功回调)中记录speakers数组的内容。我想知道您是否看到一个包含6个项目的数组记录在那里。此外,控制台中是否存在任何绑定错误?你能做一把小提琴吗?我不能仅仅通过查看代码就发现任何错误。
define(['logger', 'durandal/system', 'model'],
function (logger, system, model) {

var getSpeakersPartials = function(speakersObservable) {
    // reset the observable
    speakersObservable([]);

    // set ajax call
    var options = {
        url: '/api/speakers',
        type: 'GET',
        dataType: 'json'
    };

    // make call
    return $.ajax(options)
        .then(querySucceeded)
        .fail(queryFailed);

    // handle the ajax callback
    function querySucceeded(data) {
        var speakers = [];
        data.sort(sortSpeakers);
        for (i = 0; i < 6; i++) {
            var item = data[i];
            var speaker = new model.SpeakerPartial(item);
            speakers.push(speaker);
        }
        speakersObservable(speakers);
        log('Retrieved speaker partials from remote data source',
            speakers,
            true);
    }

};

var dataservice = {
    getSpeakersPartials: getSpeakersPartials
};
return dataservice;

//#region Internal methods
function sortSpeakers(s1, s2) {
    return(s1.firstName + s1.lastName > s2.firstName + s2.lastName)
        ? 1 : -1;
}


function queryFailed(jqXHR, textStatus) {
    var msg = 'Error getting data. ' + textStatus;
    logger.log(msg,
        jqXHR,
        system.getModuleId(dataservice),
        true);
}

function log(msg, data, showToast) {
    logger.log(msg,
        data,
        system.getModuleId(dataservice),
        showToast);
}
//#endregion