0

This post is a follow up of this (the goal is set img to visibily and set the src)

html

<form class="form-horizontal" role="form" name="form" data-ng-submit="add()">
    <div class="form-group">
        <input type="text" name="title" tabindex="1" class="form-control" placeholder="{{ 'items.form.title' | translate }}" data-ng-model="item.title" required="required" data-ng-minlength="3" data-ng-maxlength="25" user-feedback />
    </div>
    <div class="form-group">
        <input type="text" name="ingredients" tabindex="2" class="form-control" placeholder="{{ 'items.form.ingredients' | translate }}" data-ng-model="item.ingredients" required="required" ng-pattern="/^\w(\s*,?\s*\w)*$/" user-feedback />
    </div>
    <div class="form-group">
        <input type="text" name="price" tabindex="3" class="form-control" placeholder="{{ 'items.form.price' | translate }}" data-ng-model="item.price" required="required" data-smart-float user-feedback />  
    </div>
    <div class="form-group">
        <button type="button" tabindex="4" class="btn btn-default btn-lg" item="item" data-uploader>{{ 'items.form.upload' | translate }}</button>
        <input type="text" name="url" style="display:none;" required="required" data-ng-model="item.url" />
    </div>
    <div class="form-group form-no-required clearfix">
        <div class="pull-right">
            <button type="submit" tabindex="5" class="btn btn-primary" data-ng-disabled="form.$invalid">{{ 'items.form.submit' | translate }}</button>
        </div>
    </div>
</form>

js

app.controller('ItemsUpdateController', function ($scope, item, Items, $state) {
    item.$loaded().then(function(data) {
        $scope.item = data;   
    });
    $scope.add = function() {console.log($scope.item);
       /* Items.update(item.$id,$scope.item).then(function () {
            $state.transitionTo('items');
        });*/
    }
});
app.directive('uploader', function() {
    return {
        restrict: 'A',
        scope:{
            item: '='
        },
        link: function(scope, element, attrs) {
            if (window.File && window.FileReader && window.FileList && window.Blob) {
                var fileElem = angular.element('<input type="file" style="display:none;">');
                var imgElem = angular.element('<img src="" width="50" style="margin-left:10px;visibility:hidden;">');
                element.after(fileElem);
                element.after(imgElem);console.log(scope.item); //This give me undefined
                /*if(scope.item.url){
                     imgElem.css('visibility','visible');
                     imgElem[0].src = scope.item.url;
                }*/
                fileElem.on('change',function(e){
                    e.stopPropagation();
                    var files = e.target.files;
                    var reader  = new FileReader();
                    reader.onloadend = function () {
                        var url = reader.result;
                        imgElem.css('visibility','visible');
                        imgElem[0].src = url;
                        scope.$apply(function () {
                           scope.item.url = url;
                        });
                    }
                    reader.readAsDataURL(files[0]);
                });
                element.on('click', function(e) {
                    e.stopPropagation();
                    fileElem[0].click();
                });
                element.on('$destroy',function(){
                    element.off('click');
                });
                fileElem.on('$destroy',function(){
                    fileElem.off('change');
                });

            }
        },
    };
});

Why console.log(scope.item); give me undefined but I can see the right values fill the form ? and how can I get the value ? (btw I've tried also with $timeout or $apply but both doesn't work)

I've also tried with

scope.$watch('item', function(newVal, oldVal){
     console.log(newVal, oldVal);
}, true);

but I've got [Exception... "Illegal operation on WrappedNative prototype object" nsresult: "0x8057000c (NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)"

and I don't really understand why

console.log(scope.item);// Object { $$conf={...}, $id="-J_C-q-6bIW9PBZzqpAg"
console.log(angular.equals({}, scope.item));// but this is true !

Ugly ends up

//controller
$scope.item = item;
$scope.item.$loaded().then(function(data) {
  $scope.item = data;   
});
//directive
if(scope.item.$id){
    scope.item.$loaded().then(function(data) {
        imgElem.css('visibility','visible');
        imgElem[0].src = data.url;
    });

if anyone have got a better solution is welcome :) }

Community
  • 1
  • 1
Whisher
  • 31,320
  • 32
  • 120
  • 201
  • So what is the question here? How about picking exactly one? "angularfire $loaded can access the value in the directive" is a statement and there are perhaps 5 questions asked inline and a block of slightly related code. Could this be narrowed to exactly one question and code that demonstrates exactly that problem? "Why doesn't my code work" is essentially asking "debug my code for me"; see [creating an mcve](http://stackoverflow.com/help/mcve). – Kato Nov 02 '14 at 18:07
  • So what's your point ? Do you want change the title ? or it's normal to do the 'ugly hack' (double $loaded) as I made in my ends up. Is there a way to get the value in the directive ? I followed all the SO rules so I don't really see the point, – Whisher Nov 02 '14 at 18:35
  • BTW I've changed the title. – Whisher Nov 02 '14 at 18:42

0 Answers0