“TypeError:undefined不是函数,Durandal SPA

时间:2014-08-08 13:14:57

标签: javascript jquery durandal

我正在尝试创建简单的Durandal SPA,但是我有下面的错误,并且在几小时后,无法找到问题所在,我唯一可能是数据服务定义在speakers.js的顶部,但不是确定我的假设是否正常。

"TypeError: undefined is not a function
    at refresh (http://localhost:38945/App/speakers.js:21:16)
    at Object.activate (http://localhost:38945/App/speakers.js:17:20)
    at tryActivate (http://localhost:38945/Scripts/durandal/composition.js:112:44)
    at Object.composition.bindAndShow (http://localhost:38945/Scripts/durandal/composition.js:491:13)
    at Object.<anonymous> (http://localhost:38945/Scripts/durandal/composition.js:602:29)
    at Object.<anonymous> (http://localhost:38945/scripts/vendor?v=CoGrntPfi-B6C9wW1BBGgsUzERM99npj7WHKHsHaK8U1:1:37083)
    at l (http://localhost:38945/scripts/vendor?v=CoGrntPfi-B6C9wW1BBGgsUzERM99npj7WHKHsHaK8U1:1:35715)
    at Object.s.fireWith [as resolveWith] (http://localhost:38945/scripts/vendor?v=CoGrntPfi-B6C9wW1BBGgsUzERM99npj7WHKHsHaK8U1:1:36527)
    at Object.t.(anonymous function) [as resolve] (http://localhost:38945/scripts/vendor?v=CoGrntPfi-B6C9wW1BBGgsUzERM99npj7WHKHsHaK8U1:1:37507)
    at Object.<anonymous> (http://localhost:38945/Scripts/durandal/viewEngine.js:167:25)"

dataservice.js

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

    var getSpeakerPartials = function (speakerObservable) {
        // reset the obersvable
        speakerObservable([]);

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

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

        function querySucceeded(data) {
            var speakers = [];
            data.sort(sortSpeakers);
            data.forEach(function (item){
                var s = new model.SpeakerPartial(item);
                speaker.push(s);
            });
            speakerObservable(speakers);
            log('Retrieved speakes from dremote data source', speakers, true);
        }

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

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

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

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

speakers.js

define(['dataservice'], function (ds) {
    debugger;
    var speakers = ko.observableArray();
    var initialized = false;
        var vm = {
            activate: activate,
            speakers: speakers,
            title: 'Speakers',
            refresh: refresh
        };

        return vm;

        function activate() {
            if (initialized) { return; }
            initialized = true;
            return refresh();
        }

        function refresh(){
            ds.getSpeakersPartials(speakers);
        }
    }
);

和我的vs studio结构如果有帮助:http://screencast.com/t/uvqYqNrIz

2 个答案:

答案 0 :(得分:1)

你可以试试吗

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

而不是

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

答案 1 :(得分:0)

如果您能正确看到函数名称为getSpeakerPartials,并且您将其称为ds.getSpeakersPartials()。我认为这就是问题。

如果您看到错误,则会在undefined is not a function的{​​{1}}行显示21。你的第21行是speakers.js