Il blog di Giuseppe Marchi - SharePoint MVP
NAVIGATION - SEARCH

Errore: "'b' is null or not an object" utilizzando l'ECMAscript client object model di SharePoint 2010

In queste ultime due settimane ho lavorato tanto con il Client Object Model per ECMAScript, legato sopratutto alle operazioni che l'utente finale può fare tramite la barra dei Ribbon. Spero di riuscire a fare un pò di contenuti per il blog e per SharePoint Community a riguardo, perchè l'UI Framework di SharePoint 2010 è veramente carino.
Comunque, durante queste prove mi sono scontrato con questo errore:

'b' is null or not an object

Questo veniva scatenato quando cercavo di recuperare delle proprietà di un elemento selezionato, subito dopo aver richiamato il metodo executeQueryAsync().
Questo metodo vuole la specifica di due delegati per gestire il successo della chiamata lato server o un'eventuale errore.
Nel mio caso, lo script non arriva ne al primo gestore ne al secondo, ma veniva fermato durante il callback.
Ecco il codice ERRATO che avevo scritto:

var selectedItem;


function initializeScript() {
var items = SP.ListOperation.Selection.getSelectedItems();
var context = new SP.ClientContext.get_current();
var currentList = context.get_web().get_lists().getById(SP.ListOperation.Selection.getSelectedList());
selectedItem = currentList.getItemById(items[0].id);
context.load(selectedItem);
context.executeQueryAsync(Function.createDelegate(this, this.onSuccessMethod), Function.createDelegate(this, this.onFailureMethod));
}

function onSuccessMethod(sender, args) {
alert('success');
}

function onFailureMethod(sender, args) {
alert('fail');
}

Dove sta l'errore ? L'errore sta nella specifica del nome dei due delegati.
Nel mio script, faccio riferimento ai metodi onSuccessMethod e onFailureMethod utilizzando la parola chiave "this". Ecco, questo script funzionerebbe se lo estraessi dalla funzione "initializeScript". Essendo invece all'interno di tale funzione, la parola chiave "this" manda in errore il callback perchè così non vengono trovati i due delagati.
Togliendo la parole chiave "this", il meccanismo di callback sa quali sono i metodi che devono gestire gli eventi di successo o errore e tutti ritorna così a funzionare.

var selectedItem;


function initializeScript() {
var items = SP.ListOperation.Selection.getSelectedItems();
var context = new SP.ClientContext.get_current();
var currentList = context.get_web().get_lists().getById(SP.ListOperation.Selection.getSelectedList());
selectedItem = currentList.getItemById(items[0].id);
context.load(selectedItem);
//context.executeQueryAsync(Function.createDelegate(this, this.onSuccessMethod), Function.createDelegate(this, this.onFailureMethod)); context.executeQueryAsync(Function.createDelegate(this, onSuccessMethod), Function.createDelegate(this, onFailureMethod));
}

function onSuccessMethod(sender, args) {
alert('success');
}

function onFailureMethod(sender, args) {
alert('fail');
}


Quindi, se capita anche a voi questo errore, sappiate che i nomi dei due delegati che gestiranno il callback dovranno essere scritti senza errori.
blog comments powered by Disqus