angularfire使用$ loaded如何访问指令中的数据

时间:2014-10-30 08:26:03

标签: angularjs firebase angularfire

这篇文章是后续的 this (目标是将img设置为visibily并设置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');
                });

            }
        },
    };
});

为什么是console.log(scope.item);给我不明确的 但我可以看到正确的值填写表格? 我怎样才能获得价值? (顺便说一句,我也试过$ timeout或$ apply但两者都不起作用)

我也试过

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

但我有 [例外......“WrappedNative原型对象上的非法操作”nsresult:“0x8057000c(NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)”

我真的不明白为什么

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

丑陋结束

//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;
    });

如果有人有更好的解决方案,欢迎:)     }

0 个答案:

没有答案