2013-11-21 109 views
2

我一直在我的應用中廣泛使用骨幹網。我真的很喜歡它在模型 - >視圖中給我的事件綁定。我用骨幹開始了我的Javascript編碼,如果沒有它,我真的不知道如何編寫代碼。繞過使用骨幹網

我正在構建另一個小應用程序。我想在不使用主幹的情況下編碼。我有一個觀點和與之相關的模型。模型更改時,我想查看更新。目前在每一個方法,我做手工是這樣的:

function updatesomething(){ 
    //update model 
    model[something] = new updated value; 

    //update view 
    $(".something").addClass("updated value"); 
} 

我想就這個複雜的具有發佈 - 訂閱類型的模式,其視圖所監聽的模式變化。我將如何實現它在普通的JavaScript,而無需使用骨幹,使我的代碼看起來是這樣的:

function updatesomething(){ 
    model.update(something); 
} 

//and view listening to this updates automatically 

回答

2

這是一個很大的問題,一個你應該問。開發者不加思索地伸手去尋找框架,就像有人在沒有品嚐食物的情況下先抓鹽一樣。對於很多人來說,即使是簡單的框架,許多任務都是矯枉過正的,可以用香草js和基本的OO模式來代替。

下面是使用vanilla js的sub/pub模式的簡單演示。您可以使用提供的mixin來使任何普通的js模型對象可觀察。然後你可以讓你的觀點訂閱他們並更新變化。

http://jsbin.com/umOhiFOP/1/edit

function makeObservable() { 
    this._subscribers = []; 
    this.subscribe = function(event, target, callback) { 
    this._subscribers.push({event:event, target:target, callback:callback}); 
    } 
    this.trigger = function(event) { 
    this._subscribers.forEach(function(subscriber) { 
     if (event !== subscriber.event) return; 
     subscriber.callback.call(subscriber.target); 
    }); 
    } 
} 

function Todo() { 
    this.isDone = false; 
    this.complete = function() { 
    this.isDone = true; 
    this.trigger('completed'); 
    } 
} 
makeObservable.call(Todo.prototype); 

function TodoSubscriber() { 
    this.onComplete = function() { 
    console.log('Todo completed'); 
    } 
} 

var todo = new Todo(); 
var listener = new TodoSubscriber(); 

todo.subscribe('completed', listener, listener.onComplete); 

todo.complete(); 

你可能會喜歡這篇文章太:https://moot.it/blog/technology/riotjs-the-1kb-mvp-framework.html

+1

完全一致,你應該加入層之前瞭解的基礎知識,但只是一定要看看成熟的解決方案,同時你學習通過重新實施。例如,Backbone會在刪除視圖時隱式移除事件監聽器。爲了避免內存泄漏,這是你想在任何可觀察的重新實現中重新創建的東西。 – numbers1311407

+0

好點,數字 – Jonah