2017-03-05 1 views
0

VM이 전역으로이 위의 코드 vm.updatecol에서 최소화 일하는 내 이전 코드의 버전 ..사용 계시 모듈 패턴은 더 이상 글로벌 데이터 등의 문제를 야기

var data = [mydata]; 
var appscope = function() { 
    function col(c) { 
     var self = this; 
     this.view = ko.observable(false); 
     this.view.subscribe(function(newValue) { 
      vm.updateCol(); 
     }); 
    } 
    var myModel = function() { 
     var self = this; 
     self.viewdata = ko.observableArray(data); 
     self.updateCol = function() { 
      console.log("updatecol called") 
     }; 
    }; 
    var vm = new myModel(); 
    ko.applyBindings(vm); 
}();  

작동되고 다음 appscope에 관한 한. 또한 데이터는 글로벌입니다 ..

이제 VM이 밖으로 나는이 작동하지 않습니다 .. 위의 코드 vm.updatecol에서

var appscope = function() { 
    var that = this; 

    function col(c) { 
     var self = this; 
     this.view = ko.observable(false); 
     this.view.subscribe(function(newValue) { 
      // vm.updateCol(); no longer works.... 
      //that.appscope.myModel().updatecol(); throws error in myModel 
     }); 
    } 
    var myModel = function(data) { 
     var self = this; 
     self.viewdata = ko.observableArray(data); 
     self.target=ko.observable(null); 
     self.target(new col([])); 
     self.updateCol = function() { 
      console.log("updatecol called") 
     }; 
    }; 
    return { 
     myModel: myModel 
    }; 
}(); 
(function(appscope) { 
    var vm = new appscope.myModel([mydata]); 
    ko.applyBindings(vm); 
})(appscope); 

을 공개 모듈 패턴을 사용하려고하고 아래에 코드를 변경하고있어 범위. 나는 심지어 그것을 시도했다 .appscope.myModel(). updatecol()하지만 myModel을 다시 만들려고 시도하고 데이터가 없기 때문에 다른 오류가 발생합니다.

어떻게 해결할 수 있습니까? 모든 도움을 진심으로 감사드립니다. 감사합니다.

+1

* * "자바 스크립트 계시 모듈 패턴을 사용하여 더 이상 글로벌 데이터 등의 문제가 만듭니다"아니오 : target 정말 바꿀 수 있다면, 우리는 내가 위에서 # 3으로 의지하는 이유의 한 부분 인 일부 구독 관리를 할 필요가 아니요, ** 데이터가 더 이상 글로벌이 아니므로 ** ** 문제를 해결합니다. :-) –

+0

이번에는 문제가 해결되었지만 도움을 청할 때 일관성 있고 명확한 들여 쓰기/형식 지정을 사용하여 코드의 서식을 지정하십시오. –

+0

myModel에서 다음 줄을 추가하십시오. self.target = ko.observable (null); self, target (new col ([])) – Arnab

답변

0

좋은 소식! colmyModelvm에서 성공적으로 분리했습니다. 그것은 대부분 좋은 일입니다. 그러나 colview이 변경 될 때 여전히 updateCol으로 전화하기를 원한다면 어떻게 든 연결해야합니다. colview

  • 재 방문에 가입 myModel에두고 그것을

  • 를 만들 때

    1. colmyModel 인스턴스에 대한 참조를 전달합니다

      당신은 세 가지 옵션이 있습니다 전체 구조

    3 번째 느낌이 들지만, 더 이상의 문맥없이 말할 수는 없습니다. # 1의

    예 : # 2의

    var appscope = function() { 
        var that = this; 
    
        function col(c, model) {      // *** 
         var self = this; 
         this.view = ko.observable(false); 
         this.view.subscribe(function(newValue) { 
          model.updateCol();     // *** 
         }); 
        } 
        var myModel = function(data) { 
         var self = this; 
         self.viewdata = ko.observableArray(data); 
         self.target=ko.observable(null); 
         self.target(new col([], self));   // *** 
         self.updateCol = function() { 
          console.log("updatecol called") 
         }; 
        }; 
        return { 
         myModel: myModel 
        }; 
    }(); 
    (function(appscope) { 
        var vm = new appscope.myModel([mydata]); 
        ko.applyBindings(vm); 
    })(appscope); 
    

    예 :

    var appscope = function() { 
        var that = this; 
    
        function col(c) { 
         var self = this; 
         this.view = ko.observable(false); 
         // *** Not subscribing here 
        } 
        var myModel = function(data) { 
         var self = this; 
         self.viewdata = ko.observableArray(data); 
         self.target=ko.observable(null); 
         var c = new col([]);     // *** 
         self.target(c);      // *** 
         c.view.subscribe(function(newValue) { // *** 
          self.updateCol();     // *** 
         });         // *** 
         self.updateCol = function() { 
          console.log("updatecol called") 
         }; 
        }; 
        return { 
         myModel: myModel 
        }; 
    }(); 
    (function(appscope) { 
        var vm = new appscope.myModel([mydata]); 
        ko.applyBindings(vm); 
    })(appscope); 
    

    이 두 번째 방법은 당신이 target 관찰을했습니다 문제를 가지고있다.

    var appscope = function() { 
        var that = this; 
    
        function col(c) { 
         var self = this; 
         this.view = ko.observable(false); 
         // *** Not subscribing here 
        } 
        var myModel = function(data) { 
         var viewSub;          // *** 
         var self = this; 
         self.viewdata = ko.observableArray(data); 
         self.target=ko.observable(null); 
         var c = new col([]);        // *** 
         self.target(c);          // *** 
         subScribeCol(c);         // *** 
         self.target.subscribe(function(newCol) {   // *** 
          viewSub.dispose();        // *** 
          subcribeCol();         // *** 
         });             // *** 
         self.updateCol = function() { 
          console.log("updatecol called") 
         }; 
         function subscribeCol(c) { 
          viewSub = c.view.subscribe(function(newValue) { // *** 
           self.updateCol();       // *** 
          });            // *** 
         } 
        }; 
        return { 
         myModel: myModel 
        }; 
    }(); 
    (function(appscope) { 
        var vm = new appscope.myModel([mydata]); 
        ko.applyBindings(vm); 
    })(appscope);