2012-12-18 60 views
0

我一直在試圖弄清爲什麼作用域在這兩個原型對象上有點棘手 - 第一個是基於PreloadJS的預加載器,第二個是我的QUnit測試。我已經解決了該問題,但我不小心刪除了原來的線程其中有人善意回應,所以我已經發布了此最新的工作版本,以三江源說那個人javascript在requirejs和qunit中的作用域

'use strict'; 

define(['preloadjs'], function (PreloadJS) { 
    var Preloader = function (model) { 
     this.model = model; 
     this.totalLoaded = 0; 
     this.context = model.context; 
     this.isFinished = false; 

     this.onStart = (model.onStart != null) ? model.onStart : function (e) {}; 
     this.onUpdate = (model.onUpdate != null) ? model.onUpdate : function (e) {}; 
     this.onComplete = (model.onComplete != null) ? model.onComplete : function (e) {}; 

     this.preload = null; 

     // make sure assets exists 
     if (model.assets == null) { 
      model.assets = {}; 
     } 

     this.init(); 
    }; 

    /** 
    * initialise preloader 
    * @return {null} 
    */ 
    Preloader.prototype.init = function() { 
     var self = this; 

     var preload = new PreloadJS(); 
     if (this.onStart != null) { 
      this.onStart(); 
     } 
     preload.onProgress = function (e) { self.onUpdate(e); }; 
     preload.onComplete = function (e) { self.handleComplete(e); }; 
     preload.onFileLoad = function (e) { self.onFileLoad(e); }; 
     preload.loadManifest(this.model.manifest); 

     this.preload = preload; 
    }; 

    Preloader.prototype.handleComplete = function(e) { 
     this.isFinished = true; 

     this.onComplete(e); 
    }; 

    /** 
    * called when each file in the manifest is loaded - if it's an image, 
    * create an image object and populate its properties 
    * @param {event} e event object 
    * @return {null} 
    */ 
    Preloader.prototype.onFileLoad = function(e) { 
     if (e.type == PreloadJS.IMAGE) { 
      var self = this; 

      var img = new Image(); 
      img.src = e.src; 
      img.onload = function() { self.handleFileComplete(); }; 
      this.model.assets[e.id] = img; 
     } 
    }; 

    /** 
    * iterates totalLoaded when each image has intialised 
    * @return {null} 
    */ 
    Preloader.prototype.handleFileComplete = function() { 
     this.totalLoaded++; 
    }; 

    // public interface 
    return Preloader; 
}); 

,這是預加載QUnit測試

'use strict'; 

define(function (require) { 
    var Preloader = require('Preloader'); 

    var manifest = [ 
     { src : '../app/images/splash-screen.jpg', id : 'splash-screen' } 
    ]; 

    var assets = {}; 

    var startFired = 0; 
    var updateFired = 0; 
    var completeFired = 0; 

    var totalLoaded = 0; 

    var scopetest = 'test'; 

    var loaded = 0; 

    var pl = new Preloader({ 
     manifest : manifest, 
     assets : assets, 
     onStart : function (e) { 
      startFired++; 
     }, 
     onUpdate : function (e) { 
      updateFired++; 

      totalLoaded = e.loaded; 
     }, 
     onComplete : function (e) { 
      completeFired++; 

      // adding the unit tests into the onComplete function fixed the inconsistent test results i was getting 
      test('Preloader tests', function() { 
       expect(4); 

       equal(startFired, 1, 'onStart was called once exactly'); 
       ok((updateFired > 0), 'onUpdate was called at least once. Total: ' + updateFired); 
       equal(completeFired, 1, 'onComplete was called once exactly'); 
       notEqual(pl.model.assets['splash-screen'], undefined, 'there was at least one asset loaded: ' + pl.model.assets['splash-screen']); 

      }); 

      QUnit.start(); 
     } 
    }); 

    QUnit.stop(); 
}); 

謝謝你們的響應和刪除線程

+0

請取消刪除舊線程,而不是重新問這個問題 – Bergi

+0

道歉 - 找不到 - 如果我點擊我的收件箱中的鏈接它說'未找到頁面這個問題是由作者自願刪除 - 就是你! – obie

+0

Google幫助:http://stackoverflow.com/questions/13938324/javascript-scoping-in-callbacks。請重新打開那個,[編輯](http://stackoverflow.com/posts/13938324/edit)或者回答它,並在這裏刪除這個。 – Bergi

回答

0

在OP已經回答了這個問題道歉 - 這是我接受

+0

它的答案在哪裏? – Bergi

+0

它沒有回答,但有人迴應,我讚賞它 – obie