1

嗨我有一個$ bind的問題,我綁定了一個模型並通過ng-repeat輸出模型。 ng-repeat輸出存儲的數據,並提供一些用於添加/更改數據的字段。這些更改反映在範圍內,但未同步到Firebase。

這是我的$ bind實現的問題嗎?

的HTML:

<iframe id="fpframe" style="border: 0; width: 100%; height: 410px;" ng-if="isLoaded"></iframe> 
<form> 
    <ul> 
    <li ng-repeat="asset in upload_folder" ng-class="{selected: asset.selected}"> 
     <div class="asset-select"><input type="checkbox" name="selected" ng-model="asset.selected"></div> 
     <div class="asset-thumb"></div> 
     <div class="asset-details"> 
     <h2>{{asset.filename}}</h2> 
     <p><span class="asset-filesize" ng-if="asset.size">Filesize: <strong><span ng-bind-html="asset.size | formatFilesize"></span></strong></span> <span class="asset-filetype" ng-if="asset.filetype">Filetype: <strong>{{asset.filetype}}</strong></span> <span class="asset-dimensions" ng-if="asset.width && asset.height">Dimensions: <strong>{{asset.width}}x{{asset.height}}px</strong></span> <span class="asset-type" ng-if="asset.type">Asset Type: <strong>{{asset.type}}</strong></span></p> 
     <label>Asset Description</label> 
     <textarea ng-model="asset.desc" cols="10" rows="4"></textarea> 
     <label>Creator</label> 
     <input type="text" ng-model="asset.creator" maxlength="4000"> 
     <label>Release Date</label> 
     <input type="text" ng-model="asset.release"> 
     <label for="CAT_Category">Tags</label> 
     <input type="text" ng-model="asset.tags" maxlength="255"> 
     </div> 
    </li> 
    </ul> 
</form> 

控制器:(fpKey是存儲Filepicker API密鑰的常數)

.controller('AddCtrl', 
    ['$rootScope', '$scope', '$firebase', 'FBURL', 'fpKey', 'uploadFiles', 
    function($rootScope, $scope, $firebase, FBURL, fpKey, uploadFiles) { 
    // load filepicker.js if it isn't loaded yet, non blocking. 
    (function(a){if(window.filepicker){return}var b=a.createElement("script");b.type="text/javascript";b.async=!0;b.src=("https:"===a.location.protocol?"https:":"http:")+"//api.filepicker.io/v1/filepicker.js";var c=a.getElementsByTagName("script")[0];c.parentNode.insertBefore(b,c);var d={};d._queue=[];var e="pick,pickMultiple,pickAndStore,read,write,writeUrl,export,convert,store,storeUrl,remove,stat,setKey,constructWidget,makeDropPane".split(",");var f=function(a,b){return function(){b.push([a,arguments])}};for(var g=0;g<e.length;g++){d[e[g]]=f(e[g],d._queue)}window.filepicker=d})(document); 
    $scope.isLoaded = false; 
    // Bind upload folder data to user account on firebase 
    var refUploadFolder = new Firebase(FBURL.FBREF).child("https://stackoverflow.com/users/" + $rootScope.auth.user.uid + "/upload_folder"); 
    $scope.upload_folder = $firebase(refUploadFolder); 
    $scope.upload_folder.$bind($scope,'upload_folder'); 
    // default file picker options 
    $scope.defaults = { 
     mimetype: 'image/*', 
     multiple: true, 
     container: 'fpframe' 
    }; 
    // make sure filepicker script is loaded before doing anything 
    // i.e. $scope.isLoaded can be used to display controls when true 
    (function chkFP() { 
     if (window.filepicker) { 
     filepicker.setKey(fpKey); 
     $scope.isLoaded = true; 
     $scope.err = null; 
     // additional picker only options 
     var pickerOptions = { 
      services:['COMPUTER', 'FACEBOOK', 'GMAIL'] 
     }; 
     var storeOptions = { 
      location: 'S3', 
      container: 'imagegrid' 
     }; 
     var options = $.extend(true, $scope.defaults, pickerOptions); 
     // launch picker dialog 
     filepicker.pickAndStore(options, storeOptions, 
      function(InkBlobs){ 
      uploadFiles.process(InkBlobs, $scope.upload_folder); 
      }, 
      function(FPError){ 
      $scope.err = FPError.toString(); 
      } 
     ); 
     } else { 
     setTimeout(chkFP, 500); 
     } 
    })(); 
    }]) 

我也有一個服務處理來自Filepicker輸入,這創造了新的在被綁定參考的Firebase中的條目(使用Firebase方法而不是AngularFire可能會打破綁定?)

.service('uploadFiles', ['$rootScope', 'FBURL', function($rootScope, FBURL) { 
    return { 
    process: function(InkBlobs, upload_folder) { 
     var self = this; 
     var countUpload = 0; 
     // write each blob to firebase 
     angular.forEach(InkBlobs, function(value, i){ 
     var asset = {blob: value}; 
     // add InkBlob to firebase one it is uploaded 
     upload_folder.$add(asset).then(function(ref){ 
      self.getDetails(ref); 
      countUpload++; 
     }); 
     }); 
     // wait for all uploads to complete before initiating next step 
     (function waitForUploads() { 
     if (countUpload === InkBlobs.length) { 
      self.createThumbs(upload_folder, { multi: true, update: false, location: 'uploads' }); 
     } else { 
      setTimeout(waitForUploads, 500); 
     } 
     })(); 
    }, 
    getDetails: function(ref) { 
     // after InkBlob is safely stored we will get additional asset data from it 
     ref.once('value', function(snap){ 
     filepicker.stat(snap.val().blob, {size: true, mimetype: true, filename: true, width: true, height: true}, 
      function(asset) { 
      // get asset type and filetype from mimetype 
      var mimetype = asset.mimetype.split('/'); 
      asset.type = mimetype[0].replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); 
      asset.filetype = mimetype[1]; 
      // add metadata to asset in upload folder 
      ref.update(asset); 
      }); 
     }); 
    }, 
    createThumbs: function(ref, options) { 
     var self = this; 
     // default options 
     options.multi = options.multi || false; 
     options.update = options.update || false; 
     options.location = options.location || 'asset'; 
     // if pathbase is not provided generate it based on provided location 
     if (!options.pathbase) { 
     if (options.location === 'assets') { 
      options.pathbase = FBURL.LIBRARY + "/assets/"; 
     } else if (options.location === 'uploads') { 
      options.pathbase = "https://stackoverflow.com/users/" + $rootScope.auth.user.uid + "/upload_folder/"; 
     } else { 
      throw new Error('SERVICE uploadFiles.createThumbs: options.location is not valid must be assets or uploads'); 
     } 
     } 
     var generateThumb = function(blob, path) { 
     filepicker.convert(blob, 
      { width: 200, height: 150, fit: 'crop' }, 
      { location: 'S3', access: 'public', container: 'imagegrid', path: '/thumbs/' }, 
      function(tnInkBlob){ 
      var refThumbBlob = new Firebase(FBURL.FBREF).child(path); 
      refThumbBlob.set(tnInkBlob); 
      }, 
      function(FPError){ 
      alert(FPError); 
      }, 
      function(percentage){ 
      // can use to create progress bar 
      } 
     ); 
     }; 
     if (options.multi) { 
     // look at all assets in provided ref, if thumbnail is mission or update options is true generate new thumb 
     angular.forEach(ref, function(value, key){ 
      if (typeof value !== 'function' && (!value.tnblob || options.update)) { 
      // thumb doesn't exist, generate it 
      var blob = value.blob; 
      var path = options.pathbase + key + '/tnblob'; 
      generateThumb(blob, path); 
      } 
     }); 
     } else { 
     // getting thumbnail for a single asset 
     var refAsset = new Firebase(FBURL.FBREF).child(options.pathbase + ref); 
     var blob = refAsset.val().blob; 
     var path = options.pathbase + ref + '/tnblob'; 
     generateThumb(blob, path); 
     } 
    } 
    }; 
}]); 

因此,回顧一下,數據正被保存到/users/$rootScope.auth.user.uid/upload_folder,並且正在呈現在HTML中。

var refUploadFolder = new Firebase(FBURL.FBREF).child("https://stackoverflow.com/users/" + $rootScope.auth.user.uid + "/upload_folder"); 
$scope.upload_folder = $firebase(refUploadFolder); 
$scope.upload_folder.$bind($scope,'upload_folder'); 

任何想法,爲什麼是這樣的:儘管結合,在HTML形式的變化會反映在範圍內,但不是在火力地堡?我的實現是不正確的還是以某種方式破壞綁定? $ bind甚至應該以這種方式與ng-repeat一起工作?

感謝

回答

0

拍攝自己如何簡單,這是,錯誤是怎麼定義的綁定。你不能設置本身的結合,需要在範圍內兩個不同的對象......

的火力參考$scope.syncdata加載初始數據,並$scope.upload_folder所做的所有修改都會被同步到火力地堡。

var refUploadFolder = new Firebase(FBURL.FBREF).child("https://stackoverflow.com/users/" + $rootScope.auth.user.uid + "/upload_folder"); 
$scope.syncdata = $firebase(refUploadFolder); 
$scope.syncdata.$bind($scope,'upload_folder');