2013-07-03 3 views
0

비록 이것이 기본 질문이지만 몇 가지 시도로도이를 해결할 수 없습니다. (하지만이 지역에 새로운)knockoutjs를 사용하여 html로 여러 javascript 파일의 요소를 바인딩하는 방법

나는 무엇이 필요 2 별도의 자바 스크립트 파일을 가지고 있고 그들로부터 바인딩 싶습니다.

 <table style="width: 100%;"> 
      <tr> 
       <td class="auto-style1">Time For Work: </td> 
       <td><input id="Text2" type="text" data-bind="value: TimeForWork" /></td> 
      </tr> 
      <tr> 
       <td class="auto-style1">Rest </td> 
       <td><input id="Text4" type="text" data-bind="value: Rest" /></td> 
      </tr> 
    <td class="auto-style1">Project Code </td> 
       <td ><select id="Select1" data-bind='options: Projects' style="width: 312px"></select> 
         <button data-bind="click: AddProjects">Cancel</button> 
       </td> 
       <td><input id="Text6" type="text" data-bind="value:Test" /> 
     </table> 

    <script src="Scripts/TimeRecord.js"></script> 
    <script src="Scripts/ProjectDetail.js"></script> 

내 자바 스크립트 : TimeRecord.js

var ViewModel = { 
    CheckIn: ko.observable(), 
    CheckOut: ko.observable(), 
    Lunch: ko.observable(), 
    Rest: ko.observable(), 
    WorkOnProject: ko.observable(), 
    //Projects: ko.observableArray() 
}; 


ViewModel.TimeForWork = ko.dependentObservable(function() { 
    return ViewModel.CheckIn() ? ViewModel.CheckOut() ? parseFloat(this.Lunch()) ? parseFloat(this.CheckOut()) - parseFloat(this.CheckIn()) - parseFloat(this.Lunch()) : parseFloat(this.CheckOut()) - parseFloat(this.CheckIn()) : 0 : 0; 
}, ViewModel); 

ViewModel.RemainHour = ko.dependentObservable(function() { 
    return ViewModel.TimeForWork() ? ViewModel.Rest() ? ViewModel.WorkOnProject() ? parseFloat(this.TimeForWork()) - parseFloat(this.Rest()) - parseFloat(this.WorkOnProject()) : parseFloat(this.TimeForWork()) - parseFloat(this.Rest()) : parseFloat(this.TimeForWork()) : 0 
}, ViewModel); 

ProjectDetail.js 여기에

var projectLine = function() { 
    var self = this; 
    //self.RemainHour = ko.observable(); 
    self.Test = "abc"; 
    self.Projects = ko.observableArray(); 

    self.AddProjects = function() { 
     alert('abc'); 
    } 
} 
ko.applyBindings(new projectLine()); 

값은 내가 예상대로 구속력 TimeRecord.js. 그러나 ProjectDetail 값은 바인딩되지 않습니다. 심지어 self.Test 값이 표시되지 않습니다. 내가 뭘 잘못 했니?

+0

당신이 하나 개의보기 모델을 만드는 대신 다른보기 모델'ko.applyBindings' 여러 번 호출하는 그것으로'ko.applyBindings'를 호출해야합니다 (각 시간 당신이 DOM의 다른 부분에 대해 호출하지 않는 한) –

+0

@ go-oleg u 동일한 애플리케이션에서 여러 ko.applyBinding을 사용할 수 없다는 의미입니까? – DevT

+0

네, DOM 요소를 두 번째 매개 변수로 전달하지 않으면 (예 :'ko.applyBindings (viewModel, document.getElementById ("someDivId"))', 두 번째 호출은 첫 번째 호출의 경계를 재정의합니다 –

답변

0

이 경우 다른보기 모델을 만들 수 있으며 해당보기 모델을 사용하면 다른보기 모델 기능에 액세스 할 수 있습니다.

var ModelHome={ 
    TimeRecord:ViewModel , 
    Project :projectLine , 

}; 

ko.applyBindings(ModelHome); 
0

ko.applyBindings는 섹션 당 한 번만 호출 할 수 있습니다. 두 번째 매개 변수를 전달하지 않으면 섹션이 전체 페이지입니다.

이렇게하십시오.

<div id="one"> 
    <input data-bind="value: name" /> 
</div> 

<div id="two"> 
    <input data-bind="value: name" /> 
</div> 

<script type="text/javascript"> 
    var viewModelA = { 
    name: ko.observable("Anurag") 
    }; 

    var viewModelB = { 
    name: ko.observable("Chaurasia") 
    }; 

    ko.applyBindings(viewModelA, document.getElementById("one")); 
    ko.applyBindings(viewModelB, document.getElementById("two")); 
</script> 

도움이 될 것입니다.

관련 문제