2012-07-01 46 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决定接受他自己的答案,使用您的代码... –