2012-07-01 45 views
3

如何設置可觀察屬性而不對其進行任何訂閱射擊?設置knockout.js可觀察屬性而無需訂閱射擊

我有一個場景是頁面加載,ajax調用是爲了獲取一些數據,數據是循環播放,然後將當前選定的項目設置爲可觀察。我希望能夠在沒有任何訂閱的情況下設置這個observable,因爲第一次設置這個observable被認爲是它的初始狀態,並且訂閱不應該在初始狀態下執行。

function PlanViewModel() { 
    var self = this; 

    self.plans = ko.observableArray(); 
    self.selectedItem = ko.observable(); 

    self.getAllPlans = function() { 
     $.ajax({ 
      url: "/Backoffice/Home/GetAllPlans", 
      type: "POST", 
      data: {}, 
      context: this, 
      success: function (result) { 
       var planList = this.plans; 
       // clear the plan list 
       planList.removeAll(); 
       $.each(result.plans, function() { 
        var planDetail = new PlanDetail(this, self); 
        if (this.IsSelected) { 
         self.selectedItem(planDetail); // how do I set this without the subscriptions firing? 
        } 
        planList.push(planDetail); 
       }); 
      }, 
      error: function (result) { 
       alert("An error occured getting plans."); 
      } 
     }); 
    } 

    self.selectedItem.subscribe(function (newItem) { 
     newItem.repositoryUpdateSelectedPlan(); 
    } .bind(self)); 
} 

回答

-1

謝謝,我沿着這條路線走了一段路,並對其進行了一些修改。 selectedItem observable必須在模型中定義,因爲它用於綁定遍佈整個地方,但我確實按照您的建議移動了訂閱部分,而且工作效果很好。

function PlanViewModel() { 
    var self = this; 

    var selectedItemSubscription = null; 

    self.plans = ko.observableArray(); 
    self.selectedItem = ko.observable(); 

    self.getAllPlans = function() { 
     $.ajax({ 
      url: "/Backoffice/Home/GetAllPlans", 
      type: "POST", 
      data: {}, 
      context: this, 
      success: function (result) { 
       var planList = this.plans; 
       // clear the plan list 
       planList.removeAll(); 
       $.each(result.plans, function() { 
        var planDetail = new PlanDetail(this, self); 
        if (this.IsSelected) { 
         if (selectedItemSubscription != null) 
          selectedItemSubscription.dispose(); 

         self.selectedItem(planDetail); 
        } 
        planList.push(planDetail); 
       }); 

       selectedItemSubscription = self.selectedItem.subscribe(function (newItem) { 
        newItem.repositoryUpdateSelectedPlan(); 
       }.bind(self)); 
      }, 
      error: function (result) { 
       alert("An error occured getting plans."); 
      } 
     }); 
    } 
} 
+0

半天在類似的問題..我已經移動一行幾行下來: - ] thx – nilphilus

4

你可以調整你的代碼是這樣的:

function PlanViewModel() { 
    var self = this; 

    self.plans = ko.observableArray(); 

    self.getAllPlans = function() { 
     $.ajax({ 
      // … 
      success: function (result) { 
       // … 
       $.each(result.plans, function() { 
        var planDetail = new PlanDetail(this, self); 
        if (this.IsSelected) { 
         self.selectedItem = ko.observable(planDetail); 
        } 
        planList.push(planDetail); 
       }); 
       if (self.selectedItem === undefined) { 
        self.selectedItem = ko.observable(); 
       } 
       self.selectedItem.subscribe(function (newItem) { 
        newItem.repositoryUpdateSelectedPlan(); 
       }.bind(self)); 
      }, 
      // … 
     }); 
    } 
} 

也就是說,只有啓動所需的初始狀態達到淘汰賽

+0

由於OP沒有給你提供一個可惜的upvote。 =) –

+1

+1因爲這是一個很好的答案,因爲OP決定接受他自己的答案,使用您的代碼... –