2011-12-19 3 views
1

현재 선택된 항목을 편집하는 데 사용되는 항목 및 양식 목록이 있습니다. 항목을 클릭하면 컬렉션 컨트롤러의 "현재"속성으로 설정하여 편집 할 항목을 선택합니다. Here은 jsfiddle의 단순화 된 예입니다.키 업에서 TextField의 바운드 값을 동기화하지 마십시오 (항목 저장까지 대기).

내 문제는 현재 항목을 편집 할 때 변경 사항이 각 키 입력 후에 항목에 반영된다는 것입니다. '저장'을 누를 때까지 항목에 변경 사항이 반영되는 것을 원하지 않습니다. 내가 명시 적으로 말할 때까지 바운드 속성을 동기화하지 못하도록하는 방법이 있습니까?

답변

3

jsfiddle을 복사하여 결과를 원래 개체로 다시 병합하는 방법을 보여줍니다.

코드도 아래에 있습니다. Copyable mixin을 통해 복사 기능을 추가하고 Project 인스턴스의 다른 값을 복사하는 새로운 "병합"기능을 추가했습니다 (다른 옵션은 전체 개체를 대체하는 것임).

복사 기능에서 "return App.Project.create(this)"을 수행 할 수 있었지만 실험적으로 잘 작동하는 것처럼 보였지만 특별히 속성을 복사하는 것이 명확하고 확실했습니다.

// By adding Copyable, you're adding the 'copy' mixin 
App.Project = Ember.Object.extend(Ember.Copyable, { 
    save: function() { 
     console.log('saving') 
    }, 
    copy: function(deep) { 
     return App.Project.create({ 
      name: this.get('name'), 
      source: this.get('source') 
     }); 
    }, 
    // grab new values and directly insert them 
    // this way, it preserves object identity 
    merge: function(source) { 
     this.set('name', source.get('name')); 
     this.set('source', source.get('source')); 
    } 
}); 

여기, 나는 현재의 장소에 ProjectForm에서 사용하는 새 속성 (editCopy)을 추가했다. 편집이 완료되고 저장을 클릭하면 데이터가 원본으로 병합됩니다.

App.projectController = Ember.ArrayController.create({ 
    content: [], 
    current: null, 
    editCopy: null, 
    saveCurrent: function() { 
     var toSave = this.get('current'); 
     toSave.merge(this.get('editCopy')); 
     toSave.save(); 
    } 
}); 

App.ProjectEditLink = Ember.View.extend({ 
    click: function() { 
     App.projectController.set('current', this.get('project')); 
     App.projectController.set('editCopy', this.get('project').copy()); 
    } 
}); 

App.ProjectForm = Ember.View.extend({ 
    templateName: 'project_form_template' 
}); 



App.projectController.pushObject(App.Project.create({ 
    name: "jQuery", 
    source: "jquery.js" 
})); 
App.projectController.pushObject(App.Project.create({ 
    name: "Ember", 
    source: "ember.js" 
})); 
App.projectController.pushObject(App.Project.create({ 
    name: "Backbone", 
    source: "backbone.js" 
})); 
+0

아주 좋습니다. 이것은 내가 찾고있는 것을 정확하게합니다. 감사! – adamlogic

1

필드 값을 편집중인 레코드의 복사본에 바인딩하는 것이 좋습니다. 그런 다음 사용자가 저장 버튼을 클릭하면 해당 값을 가져 와서 원래 레코드로 다시 복사합니다.

+0

나는 이것이 내가 가고 싶은 방향이라고 생각하지만, 제대로 작동하지 못했습니다. 어떻게 생각하세요? – adamlogic

+0

http://contacts.strobeapp.com/에서 작업하고있는 연락처 샘플 앱을 체크 아웃 할 수 있습니다. 이것은 emberjs에 대한 업데이트 이전 이었지만 원리는 비슷해야합니다. 기본적으로 사용자가 선택한 개체의 복사본을 만들고 복사본의 데이터로 뷰를 채 웁니다. 여전히 버그가 있지만 잘하면 올바른 방향으로 안내 할 수 있습니다. [편집] 그것은 WPCoder 이미 당신에게 예제를 준 것처럼 보입니다. – Blacktiger

관련 문제