style escape angularjs angularjs-directive

angularjs - escape - ng-class



Angularjs pasando objeto a directiva. (5)

Dado que está utilizando $resource para obtener sus datos, la función de enlace de la directiva se ejecuta antes de que estén disponibles (porque los resultados de $resource son asíncronos), por lo que la primera vez en la función de enlace scope.walks estará vacía / indefinida. Dado que su plantilla de directivas contiene {{}} s, Angular configura un $watch on walks , por lo que cuando el $resource los datos, se activa $watch y se actualiza la pantalla. Esto también explica por qué ve los datos de las caminatas en la consola: en el momento en que hace clic en el enlace para ampliar el alcance, los datos se completan.

Para resolver su problema, en su función de enlace $watch para saber cuándo están disponibles los datos:

scope.$watch(''walks'', function(walks) { console.log(scope.walks, walks); })

En su código de producción, simplemente evite que no esté definido:

scope.$watch(''walks'', function(walks) { if(walks) { ... } })

Actualización: si está utilizando una versión de Angular donde $resource respalda las promesas, vea también la respuesta de @sawe.

El novato angular aquí. Estoy tratando de averiguar qué está mal al pasar objetos a directivas.

Aquí está mi directiva:

app.directive(''walkmap'', function() { return { restrict: ''A'', transclude: true, scope: { walks: ''=walkmap'' }, template: ''<div id="map_canvas"></div>'', link: function(scope, element, attrs) { console.log(scope); console.log(scope.walks); } }; });

Y esta es la plantilla donde llamo a la directiva:

<div walkmap="store.walks"></div>

store.walks es una matriz de objetos.

Cuando ejecuto esto, scope.walks registra como undefined mientras que el scope registra scope.walks como un alcance e incluso tiene un hijo con todos los datos que estoy buscando.

No estoy seguro de lo que estoy haciendo mal aquí porque este método exacto me ha funcionado anteriormente.

EDITAR:

He creado un plunker con todo el código requerido: http://plnkr.co/edit/uJCxrG

Como puede ver, el {{walks}} está disponible en el ámbito, pero necesito acceder a él en la función de enlace donde aún se está registrando como no definido.


Otra solución sería agregar ControllerAs a la directiva mediante la cual puede acceder a las variables de la directiva.

app.directive(''walkmap'', function() { return { restrict: ''A'', transclude: true, controllerAs: ''dir'', scope: { walks: ''=walkmap'' }, template: ''<div id="map_canvas"></div>'', link: function(scope, element, attrs) { console.log(scope); console.log(scope.walks); } }; });

Y luego, en su opinión, pase la variable utilizando la variable controllerAs .

<div walkmap="store.walks" ng-init="dir.store.walks"></div>


Tratar:

<div walk-map="{{store.walks}}"></div> angular.module(''app'').directive(''walkMap'', function($parse) { return { link: function(scope, el, attrs) { console.log($parse(attrs.walkMap)(scope)); } } });


su $ scope.store declarado no es visible desde el controlador ... lo declara dentro de una función ... así que solo es visible en el alcance de esa función, necesita declararlo afuera:

app.controller(''MainCtrl'', function($scope, $resource, ClientData) { $scope.store=[]; // <- declared in the "javascript" controller scope ClientData.get({}, function(clientData) { self.original = clientData; $scope.clientData = new ClientData(self.original); var storeToGet = "150-001 KT"; angular.forEach(clientData.stores, function(store){ if(store.name == storeToGet ) { $scope.store = store; //declared here it''s only visible inside the forEach } }); }); });


también puedes usar

scope.walks.$promise.then(function(walks) { if(walks) { console.log(walks); } });