Pregunta

El código es de la introducción oficial de Ember.JS:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title></title>
</head>
<body>
<script type="text/javascript" src="jquery-1.6.1.min.js"></script>
<script type="text/javascript" src="ember-0.9.3.js"></script>
<script type="text/javascript">
    var App = Ember.Application.create();

    App.president = Ember.Object.create({
        name: "Barack Obama"
    });

    App.country = Ember.Object.create({
        presidentNameBinding: "App.president.name"
    });

    App.country.get("presidentName");
</script>
</body>
</html>

Estaba tratando de mostrar el valor de retorno de App.country.get("presidentName");, así que lo envolví con alerta, pero la alerta siempre se muestra undefined. La parte cableada es si ejecuto esta declaración en la consola Firebug, se muestra correctamente que es "Barack Obama".

La introducción oficial mencionada:

Tenga en cuenta que los enlaces no se actualizan de inmediato. Ember espera hasta que todo el código de su aplicación haya terminado de ejecutarse antes de sincronizar los cambios

¿Es esta la razón por la que no puedo obtener el valor de la propiedad vinculante en el código? ¿Qué significa "el código de aplicación ha terminado de ejecutarse"?

¿Fue útil?

Solución

Cuando estás jugando con objetos que tienen enlaces como este, debes activar manualmente los enlaces para sincronizar con Ember.run.sync():

var App = Ember.Application.create();

App.president = Ember.Object.create({
    name: "Barack Obama"
});

App.country = Ember.Object.create({
    presidentNameBinding: "App.president.name"
});

Ember.run.sync(); // Manually sync bindings

alert( App.country.get("presidentName") );

Aquí hay un jsfiddle con el ejemplo: http://jsfiddle.net/ebryn/3ctns/

Otros consejos

Debe agregar un observador que esencialmente dispara después de que se ejecute el código de aplicación inicial.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title></title>
</head>
<body>
<script type="text/javascript" src="js/jquery-1.6.1.min.js"></script>
<script type="text/javascript" src="js/ember-0.9.3.js"></script>
<script type="text/javascript">
    var App = Ember.Application.create();

    App.president = Ember.Object.create({
        name: "Barack Obama"
    });

    App.country = Ember.Object.create({
        presidentNameBinding: "App.president.name"
    });

    App.country.addObserver('presidentName', function() {
        alert(App.country.get("presidentName"));
    });
</script>
</body>
</html>

Busque 'addobserver' en el INTRODUCCIÓN DE EMBER.JS.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top