2016-03-15 3 views
0
.

Это jscript через HTML-клиент Lightswitch. . Такая же процедура работает нормально, вызывается из Button, но не выполняется при вызове из события Canvas, показывая неопределенную ошибку данных.Такая же процедура обработки данных «CalcPrecio» отлично работает от кнопки, но прерывается при вызове из события Canvas, в HTML-клиенте Lightswitch.

// Creates a Canvas and add an eventlistner Works fine 

myapp.AddEditLito.Montajes_render = function (element, contentItem) { 
var itemTemplate = $("<canvas id='myCanvas' width='600' height='150'></canvas>"); 

    var canvas = myCanvas; 
    myCanvas.addEventListener('mousedown', function (event) { 
    var context = canvas.getContext('2d'); 
    DibTriangulo(screen, 50); // Draws a triangle, everything fine until here 

    // here is the problem, 
    CalcPrecio(screen, 1); // breaks with "Undefined Data.. etc." 
    }, false); 
}; 

// Called from a Button, same routine works perfect!! 

myapp.AddEditLito.Button1_execute = function (screen) { 
    CalcPrecio(screen, 1); // Works fine 
}; 

// This routine Works perfect called from a button, but fails when called from a Canvas event! 

function CalcPrecio(screen, col) { 
    $.each(screen.Liquidas.data, function (i, p) { 
     p.valor = p.cantidad * p.unitario; 
    }); 
}; 

// Что я делаю неправильно? Heeeelp!

ответ

0

Эта проблема является результатом вызова ваших подпрограмм DibTriangulo и CalcPrecio из обработчика событий mousedown вашего холста с помощью только экрана в качестве первого параметра.

В вашем обработчике событий mousedown и _render closure он определен в, экранный объект специально не настроен для обращения к экземпляру экрана LightSwitch и вместо этого просто ссылается на объект window.screen.

Чтобы решить эту проблему, вы можете просто изменить код, чтобы использовать contentItem.screen, как показано в следующем пересмотренном методе _render:

myapp.AddEditLito.Montajes_render = function (element, contentItem) { 
    var itemTemplate = $("<canvas id='myCanvas' width='600' height='150'></canvas>"); 

    var canvas = myCanvas; 
    myCanvas.addEventListener('mousedown', function (event) { 
     var context = canvas.getContext('2d'); 

     DibTriangulo(contentItem.screen, 50); // Changed to pass in contentItem.screen 

     CalcPrecio(contentItem.screen, 1); // Changed to pass in contentItem.screen 
    }, false); 
}; 

Причина, используя только экран работает в методе _execute вашей кнопки является потому, что метод _execute получает экранный объект LightSwitch в качестве его параметра (который затем используется при вызове метода CalcPrecio).