2017-01-27 11 views
0

emberJs와 함께 일하는 초보자입니다.Ember Data를 사용하여 데이터를 저장, 검색 및 삭제하는 방법은 무엇입니까?

현재 오프라인 상태에서 이전에 저장 한 데이터에 액세스해야하는 오프라인 기능을 구현하는 단계에 도달 한 엠버 앱을 개발 중입니다.

{{#link-to 'bbc'}}<img src="/assets/images/bbc-news-icon.png" alt="bbc news logo" style="max-width: 150px;min-height:150px;">{{/link-to}} 
{{log model}} 

{{#each model.articles as |item|}} 
<hr> 
<div class="panel panel-primary"> 
<div class="panel-heading"><span class="badge">Title</span> 
<h3>{{item.title}}</h3></div> 
<div class="panel-body"> 
<span class="badge">Description</span> 
{{item.description}} 
</div> 
<div class="panel-footer"><span class="badge">URL to News</span> 
<a href={{item.url}} target="_blank" role="link" aria-label={{item.title}}> {{item.title}} </a> 
</div> 
</div> 

{{/each}} 
{{outlet}} 

및 위의 템플릿

다음은 해당 경로의 js 파일, 경로/bbc.js

입니다 : 다음 코드를 내 응용 프로그램에서

은 내가 사용하는 템플릿, 템플릿/bbc.hbs 중 하나입니다 내가 알아야 할

import Ember from 'ember'; 

export default Ember.Route.extend({ 
model(){ 
    return Ember.$.get('https://newsapi.org/v1/articles?source=bbc-news&sortBy=top&apiKey=c4ea221e6833496bad7716c6c4fc5ece'); 
} 
}); 

이다 : 나는 동안이 URL을 통해 온라인으로 JSON 데이터를 가져 오기 및 데이터 저장소에 저장할 수 있도록

1) 방법 타다 남은 데이터 기능을 구현합니다.

2) 온라인/오프라인 중에 사용자가이 경로로 이동할 때 데이터 저장소에서 데이터를 경로 js 파일로 검색하십시오.

3) 온라인 중에 다시 선택하면 해당 경로에 대한 이전 데이터를 모두 삭제하고 JSON 데이터를 수신하는 URL을 통해 새 데이터를받습니다. 그리고 오프라인에서이 단계를 건너 뛰면됩니다.

나는 오프라인 기능을 구현하기 위해 이미이 응용 프로그램에서 브로콜리 서비스 기술자와 함께 서비스 작업자를 구현했습니다.

IndexedDB 기능을 사용하는 것처럼 오프라인에서 액세스 할 수있는 데이터를 저장하는 방법을 찾지 못했기 때문에 Ember 데이터가 도움이 될 수 있다고 생각합니다.

내 검토 자에게 검토를 요청하는 동안 그는 Ember Data를 broccoli-serviceworker 패키지와 함께 사용하여 Embers Data 라이브러리에 액세스 할 수있는 서비스 작업자를 구성하도록 개인적으로 제안했습니다.

오프라인 호환성이있는 데이터 저장 및 검색과 관련하여 더 나은 옵션이있는 경우 환영합니다.

이 단계별 지침과 솔루션을 제공 마십시오는 내 프로젝트에이 문제를

Github에서의 환매 특약 링크를 해결하기 위해 따라야합니다 : https://github.com/JEEVANJGA/Capstone-News-App

+1

내가 이해할 수 없다면 사용자가 오프라인에서 인터넷에서 데이터를 가져올 수 있기를 바랍니까? Ember 앱은 사용자 측에만 존재합니다. 일부 데이터를 표시하려면 먼저 사용자 브라우저에 다운로드해야합니다. 사용자 2가 작동하는 유일한 경우는 사용자 1이 Ember 앱을 열고 사물 목록을 봅니다. 2. 인터넷 연결을 끊습니다. 3. 여전히 사물 목록을 볼 수 있으며 오프라인 상태에서 앱 등을 탐색 할 수 있습니다. 그것이 당신이 구현하기 원하는 것입니까? – Senthe

+0

@Senthe 예. 그것이 내가 의미했던 것입니다. 앱은 오프라인 상태가되기 전에 온라인 상태였던 데이터를 표시해야합니다. –

답변

1

그냥 엠버 포장 $ RSVP로 얻을... 약속 및 캐싱을 위해 로컬 스토리지를 사용

  1. 봅니다 요청이 성공하면, 피드를
  2. 을 얻을 로컬 스토리지에 데이터를 저장하고
  3. 약속을 해결하기 위해
  4. 요청이 실패하면 인터넷이 없음을 의미하며 로컬 저장소에서 데이터를 검색하고 약속을 해결합니다. 선택 사항 : 1 분 내에 모델을 새로 고치려면 시간 제한을 설정하십시오. @Gennady Dogaev 의해 주어진 상기 지침에 관하여

는 @JEEVAN GEORGE 안토니 노선을 변경/bbc.js 의문의 파일은 다음과 같이

import Ember from 'ember'; 

export default Ember.Route.extend({ 
model(){ 
function getJSON(url){ 
    return new Promise(function(resolve, reject){ 
    var xhr = new XMLHttpRequest(); 

    xhr.open('GET', url); 
    xhr.onreadystatechange = handler; 
    xhr.responseType = 'json'; 
    xhr.setRequestHeader('Accept', 'application/json'); 
    xhr.send(); 
    function handler() { 
     if (this.readyState === this.DONE) { 
     if (this.status === 200) { 
      resolve(this.response); 
     } else { 
        reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']')); 
     } 
     } 
    } 
    }); 
} 
return getJSON('https://newsapi.org/v1/articles?source=bbc-news&sortBy=top&apiKey=c4ea221e6833496bad7716c6c4fc5ece').then(function(json) { 
     // on fulfillment 
     var data = JSON.stringify(json); 
     localStorage.setItem('bbcnews', data); 
     return JSON.parse(data); 
    }, function(reason) { 
     // on rejection 
       console.log(reason); 
       var data = JSON.parse(localStorage.getItem('bbcnews')); 
       console.log(data); 
      return data; 
    }); 
    } 
    }); 

이 데이터의 오프라인 액세스 가능성을 해결 ember는 ember 데이터, pouchDB 또는 indexedDB 기능을 사용하지 않고도 localstorage를 사용합니다.

+0

세션이 끝나면 로컬 저장소 데이터가 손실됩니까? 그렇다면이 솔루션은 효과가 없을 것입니다. 바로 그렇습니까? –

+0

@JEEVANGEORGEANTONY 로컬 저장소는 영구적이므로 [MDN] (https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage)에서이 저장소에 대해 알아볼 수 있습니다. 그것의 단점은 제한된 공간 (당신은 ~ 5MB에 셀 수 있음)과 속도입니다. 그러나 어쨌든 다른 클라이언트 측 저장소는 없습니다. 웹 SQL 데이터베이스는 불행히도 Chrome에서만 지원됩니다. –

+0

IndexedDB 및 PouchDB는 어떻게됩니까? –