2013-10-02 41 views
0

我想爲實體(如用戶和羣組)實施baseEntity類,但isFavourite屬性在baseEntity中時無法從persistanceId()中讀取正確的Id()。 (typeId()出來爲未定義和令人驚訝的類型在confirmDelete正確的值)淘汰賽baseEntity屬性可用性令人困惑

define(["knockout"], function (ko) { 
    var app = require('durandal/app'); 
    ko.baseEntity = function (data) { 
     var self = this; 
     self.Id = ko.observable(); 
     self.confirmDelete = function() { 
      var result; 
      app.showMessage(
       'Are you sure you want to delete the ' + self.type + ' ' + self.Name() + '?', 
       'Deleting ' + self.type, ['Yes', 'No']).then(
       function (dialogResult) { 
        dialogResult === "Yes" ? result = true : result = false; 
       }); 
      return result; 
     }; 
     self.persistanceId = function() { 
      return self.type + '-' + self.Id() + "-IsFavourite"; 
     }; 
     self.isFavourite = ko.observable(false).extend({ 
      persist: self.persistanceId() 
     }); 
     self.toggleFavourite = function() { 
      self.isFavourite(!self.isFavourite()); 
     }; 
    } 
    return { 
     model: ko.baseEntity 
    } 
}); 

但如果isFavourite而不是被在這裏baseEntity它是基團的實施例部分然後正常工作。

define(["knockout", "models/baseentity"], function (ko, baseEntity) { 
    var 
    model = function (data) { 
     var self = this; 
     baseEntity.model.call(self); 
     self.type = 'group'; 
     self.Id(data.Id); 
     self.Name = ko.observable(data.Name); 
     self.Description = ko.observable(data.Description); 
     self.Members = ko.observableArray(data.Members); 
     self.isFavourite = ko.observable(false).extend({ 
      persist: self.persistanceId() 
     }); 
    } 
    return { 
     model: model 
    } 
}); 

有人能向我解釋,這到底是怎麼回事,我怎麼能打動我的基礎屬性回到我的baseentity,因爲它是在各種其他的東西太共享。

回答

1

我不明白爲什麼你想修改knockout對象本身?我相信Dave Lowe在提示你單獨使用JavaScript時是正確的。您的模型上的屬性,只要它們影響您的視圖,應該是可觀察的,但是您的模型不需要附加到淘汰賽。

另外,考慮花費一些時間在http://objectplayground.com,它有一個關於學習面向對象的JavaScript的很好的教程。你範式應該多一點這樣的:

function Model(obj) { 

    this.attribute = obj.attribute; 

    this.observable = ko.observable(obj.observable); 

    this.localFunction = function(val) { 
     if (obj.attr == true) this.observable(val); 
    }; 
} 

Model.prototype.globalFunction = function(data) { 
    this.observable(data); 
}; 

注意,尤其是,如果該方法依賴於局部變量,也就是傳遞給構造函數的參數,那麼就需要在被定義構造函數。否則,你應該在原型上定義方法。

這一模式的工作原理與出色要求迪朗達爾因爲你可以做到以下幾點:

define(function(require) { 
    var Model = require('model'); 
    var object = new Model({}); 
}) 
+1

呀瞭解,ko.baseEntity是愚蠢的,但還是要留一些基礎模型道具的道具淘汰賽,因爲他們主要用於視圖的數據綁定。感謝您的幫助 – XGreen

+0

是的,絕對可行。如果您在Model上將屬性a設置爲ko.observable,然後創建SpecialModel構造函數並設置SpecialModel。prototype = new Model(),SpecialModel將具有可觀察屬性a,並且您可以在構造函數中調用類似this.a('abc')的東西。 –

2

我不是JavaScript的主人,但我會去分離你的模型層次的繼承從淘汰賽 - 模型的行爲如預期,如果你實現它香草?

0

好的,顯然在ko中做這個子類業務的更簡單的方法是使用ko本身。誰曾想到:)

所以,現在我已經定義我的基本型號是:

define(["knockout"], function (ko) { 
    var app = require('durandal/app'); 
    ko.baseEntity = function (type, data) { 
     var self = this; 
     self.Id = ko.observable(data.Id); 
     self.Type = ko.observable(type); 
     self.Name = ko.observable(); 
     self.persistanceId = ko.computed(function() { 
      return self.Type() + '-' + self.Id() + "-IsFavourite"; 
     }); 
     self.isFavourite = ko.observable(false).extend({ 
      persist: self.persistanceId() 
     }); 
     self.toggleFavourite = function() { 
      self.isFavourite(!self.isFavourite()); 
     }; 
     self.confirmDelete = function() { 
      var result; 
      app.showMessage('Are you sure you want to delete the ' + self.Type() + ' ' + self.Name() + '?', 'Deleting ' + self.Type(), ['Yes', 'No']) 
       .then(function (dialogResult) { 
        dialogResult === "Yes" ? result = true : result = false; 
       }); 
      return result; 
     }; 
    } 
    return { 
     model: ko.baseEntity 
    } 
}); 

正如你可以看到我現在又增加了,我進入我的具體執行相同的數據參數。這是可能的,以後我會用ko.utils.extend創造了這樣一個實例,並擴展它:

define(["knockout", "models/baseentity", "config"], function (ko, baseEntity, config) { 
    var 
    model = function (data) { 
     var self = this; 
     ko.utils.extend(self, new baseEntity.model(config.subClassTypes.user, data)); 
     self.Id(data.Id); 
     self.FirstName = ko.observable(data.FirstName); 
     self.LastName = ko.observable(data.LastName); 
     self.JobTitle = ko.observable(data.JobTitle); 
     self.UserLevel = ko.observable(data.UserLevel); 
     self.Groups = ko.observableArray(data.Groups); 
     self.ImageUrl = data.ImageUrl; 
     self.Name(self.FirstName() + ' ' + self.LastName()); 
    } 
    return { 
     model: model 
    } 
}); 

另一個子例如:

define(["knockout", "models/baseentity", "config"], function (ko, baseEntity, config) { 
    var 
    model = function (data) { 
     var self = this; 
     ko.utils.extend(self, new baseEntity.model(config.subClassTypes.group, data)); 
     self.Id(data.Id); 
     self.Name(data.Name); 
     self.Description = ko.observable(data.Description); 
     self.Members = ko.observableArray(data.Members);  
    } 
    return { 
     model: model 
    } 
}); 

這樣,我設法讓我的方法轉移到了基地,它工作正常。我討厭回答我自己的問題,所以等待某人添加一些我可以打勾的有價值的答案。