2012-08-01 15 views
15

¿Alguien sabe cómo vincular un valor interpolado en un atributo de datos usando AngularJS?Valor de vinculación AngularJS en el atributo de datos

<input type="text" data-custom-id="{{ record.id }}" /> 

Angular no parece interpolar ese valor ya que está separado de la estructura del elemento. Alguna idea de cómo solucionar este problema?

+0

¿Puede proporcionar el ejemplo jsfiddle? –

Respuesta

6

Parece que no hay ningún problema después de todo. La plantilla se analiza y mi controlador estaba descargando los datos, pero cuando la plantilla se estaba analizando, los datos aún no estaban allí. Y la directiva que puse necesita los datos para estar allí, mientras tanto, simplemente está recogiendo datos macro vacíos.

La forma en que he resuelto esto era con el comando $ reloj:

$scope.$watch('ready', function() { 
    if($scope.ready == true) { 
    //now the data-id attribute works 
    } 
}); 

Luego, cuando el controlador se ha cargado todo el material ajax luego de hacer esto:

$scope.ready = true; 
+0

¿De qué manera es selectOptions relevante para el registro.id del que habló en la pregunta? – Hengjie

+0

He actualizado el código para que sea más relevante. – matsko

1

Parece que a me lo que eres realmente después es un Promise/Deferred: Editar

// for the purpose of this example let's assume that variables '$q' and 'scope' are 
// available in the current lexical scope (they could have been injected or passed in). 

function asyncGreet(name) { 
    var deferred = $q.defer(); 

    setTimeout(function() { 
    // since this fn executes async in a future turn of the event loop, we need to wrap 
    // our code into an $apply call so that the model changes are properly observed. 
    scope.$apply(function() { 
     if (okToGreet(name)) { 
     deferred.resolve('Hello, ' + name + '!'); 
     } else { 
     deferred.reject('Greeting ' + name + ' is not allowed.'); 
     } 
    }); 
    }, 1000); 

    return deferred.promise; 
} 

var promise = asyncGreet('Robin Hood'); 
promise.then(function(greeting) { 
    alert('Success: ' + greeting); 
}, function(reason) { 
    alert('Failed: ' + reason); 
); 

: bien, esto es un examen sencillo plo de utilizar una promesa con un controlador y vinculante:

var app = angular.module('myApp', []); 

app.controller('MyCtrl', function($scope, $q) { 
    var deferredGreeting = $q.defer(); 
    $scope.greeting = deferredGreeting.promise; 

    /** 
    * immediately resolves the greeting promise 
    */ 
    $scope.greet = function() { 
     deferredGreeting.resolve('Hello, welcome to the future!'); 
    }; 

    /** 
    * resolves the greeting promise with a new promise that will be fulfilled in 1 second 
    */ 
    $scope.greetInTheFuture = function() { 
     var d = $q.defer(); 
     deferredGreeting.resolve(d.promise); 

     setTimeout(function() { 
      $scope.$apply(function() { 
       d.resolve('Hi! (delayed)'); 
      }); 
     }, 1000); 
    }; 
});​ 

jsFiddle de Trabajo: http://jsfiddle.net/dain/QjnML/4/

Básicamente la idea es que se puede obligar a la promesa y se cumplirá una vez que la respuesta asincrónico resuelve.

+0

Esto es genial. Pero, ¿podría darme un ejemplo que se relacione mejor con mi pregunta? Me está costando entenderlo. Gracias :) – matsko

+0

Es básicamente directo de los documentos ... sería bueno darle algo que se relacione con su pregunta. – Nix

Cuestiones relacionadas