2013-08-21 2 views
1

2 개의 뷰 모델과 requirejs를 결합하여 모든 것을 결합한 간단한 응용 프로그램을 만들었습니다. 이제는 내 중첩 된 뷰 모델의 여러 버전을 가져야한다고 들었습니다. 그래서 배열을 추가하고 첫 번째 항목은 괜찮지 만 하위 항목을 추가하는 방법을 잘 모르겠습니다.내 배열에 새로운 빈 객체를 얻는 방법

다른 사용자가 다른 사용자를 추가 할 것인지 묻는 메시지가 표시되면 people 배열의 새로운 person 개체를 사용하여이 페이지로 다시 이동해야합니다. 내가 requirejs people.push(person)에서 제공하는 객체를 사용하는 경우

  • 은, 난 그냥 배열 people.push({})에 새 개체를 추가하면 하나
  • , 그때 내 녹아웃 바인딩이 새로운 작동하지 않는보다는 기존 버전을 다시 얻을 그들은 존재하지 않는 가치를 찾고 있기 때문입니다.

어떻게 people으로 person "새로운"을받을 수 있나요? 여기

내보기 모델과 뷰는

,

자료

define(['viewmodel/person'], function (person) { 
    var vm = { 
     people: [], 
     peopleIndex: 0, 
     currentPerson: currentPerson, 
    }; 

    return vm; 

    //#region Internal Methods 
    function currentPerson() { 
     return vm.people[vm.peopleIndex] 
    } 
}) 

공통 아이

define(['services/logger', ], function (logger) { 
    var person = { 
     title: "", 
     firstName: "", 
     lastName: "", 
    }; 

    return person; 
}) 

보기

<section> 
    <h2 class="page-title" data-bind="text: title"></h2> 

    <label for="firstName">Title</label><input type="text" name="firstName" data-bind="value: currentPerson().title" /> 
    <label for="firstName">Fisrt Name</label><input type="text" name="firstName" data-bind="value: currentPerson().fistName" /> 
    <label for="firstName">Last Name</label><input type="text" name="firstName" data-bind="value: currentPerson().lastName" /> 
</section> 

답변

1
당신은 (당신은 아마 당신의 value 바인딩하기 위해 작업을 ko.observable 같은 속성을 원하는)를 Person 생성자 함수에 리터럴 현재 person 객체를 변경해야

: 다음

define(['services/logger', ], function (logger) { 
    var Person = function() { 
     this.title = ko.observable(""); 
     this.firstName = ko.observable(""); 
     this.lastName = ko.observable(""); 
    }; 
    return Person; 
}) 

당신의 ViewModel에 어디를 새 인스턴스를 만들 수 new 키워드를 사용할 수있는 새로운 사람을 만들어야합니다

define(['viewmodel/person'], function (person) { 

    //... 
    people.push(new person()) 
} 

을 아니면 0123을 만들 수 있습니다 모든 속성을 포함일 경우 :

people.push({ 
    title: ko.observable(""), 
    firstName: ko.observable(""), 
    lastName: ko.observable(""), 
}); 

이 작동하지만이 코드에서 중복을 소개합니다 그래서이 방법을 사용하지 않는 것이 좋습니다.

+0

감사를 사용하지 않는 것이 좋습니다 코드에 중복을 소개합니다, 그게 내가 없어진 것입니다 . 내가 한쪽 데이터 바인딩 만 필요하다고 생각한 것처럼 뷰 모델 속성을 관찰 할 수 없었지만 이제는 녹아웃과 같은 새로운 컨텍스트로 페이지를 다시 방문하여 바인딩 결과 캐싱을 수행 할 수 있습니다. * 다시 문서를 읽기 시작합니다. * – squig

0
당신은 (당신은 아마 당신의 값 바인딩하기 위해 작업을 ko.observable 같은 속성을 원하는)는 사람의 생성자 함수에 리터럴 현재 사람 개체를 변경해야

: 다음

define(['services/logger', ], function(logger) { 
    var Person = function() { 
     this.title = ko.observable(""); 
     this.firstName = ko.observable(""); 
     this.lastName = ko.observable(""); 
    }; 
    return Person; 
}) 

당신의 ViewModel 곳에서 새 키워드를 사용하여 새 인스턴스를 만들 수있는 새로운 사람을 만들어야합니다.

define(['viewmodel/person'], function(person) { 
    //... 
    people.push(new person()); 
} 

아니면 사람들을 만들 수 있습니다.모든 속성을 포함 할 경우 푸시 ({}) 작동이 작동합니다

people.push({ 
    title: ko.observable(""), 
    firstName: ko.observable(""), 
    lastName: ko.observable(""), 
}); 

을하지만 그래서 난이 방법을