国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

mvc - Wie geht der Front-End-Code mit der Eins-zu-Viele-Beziehung zwischen Benutzeroperationen und Modell um?
PHP中文網(wǎng)
PHP中文網(wǎng) 2017-05-16 17:06:22
0
4
575

Die Szene sieht so aus:

  • Der Benutzer hat auf eine Schaltfl?che geklickt
  • Ein Modell muss aktualisiert werden
  • B-Modell muss aktualisiert werden
    ...

Ein solcher Vorgang muss auf vielen Modellen gleichzeitig basieren, sodass diese Codes nicht in einem bestimmten Modell geschrieben werden.
Es kann sich beispielsweise um Backbone handeln, das in ViewController geschrieben ist ... Aber diese Wiederverwendung von Code ist nicht gut und die Ansicht wird durcheinander gebracht.
Meine aktuelle L?sung besteht darin, die meisten Modelloperationen in einer einzigen Datei zu sammeln, aber das Problem besteht darin, dass diese Datei immer gr??er und unübersichtlicher wird.
Wie soll ein solches Problem also gel?st werden?

Die erweiterte Frage lautet: Wie organisiert man diesen Teil des Codes?
Ich habe zum Beispiel die Flux-L?sung von React verwendet und versucht, den Prozess zu kl?ren, stellte jedoch fest, dass ich nicht wusste, wo ich diesen Teil des Codes platzieren sollte..
Flux wandelt Benutzeroperationen in Aktionen um und Store überwacht diese Aktionen über den Dispatcher
Wenn eine Aktion mehreren Stores entspricht, tritt das Problem auf:
Sollte ich mehrere Aktionen verwenden, um jeweils den Stores zu entsprechen, oder sollte eine Aktion von mehreren Stores überwacht werden?

PHP中文網(wǎng)
PHP中文網(wǎng)

認證0級講師

Antworte allen(4)
曾經(jīng)蠟筆沒有小新

用戶點擊按鈕本質(zhì)上跟用戶通過URL訪問一樣,都是一種『輸入』,所以問題和處理機制都是一樣的:在view層代碼里監(jiān)聽『輸入』,處理一些view層(比如按鈕組件的toggle、URL的矯正)內(nèi)部的狀態(tài)變化,生成/提取出純粹的、抽象層級更高的(跟view組件或URL細節(jié)無關)數(shù)據(jù)/消息,用某種事件機制廣播出去,之后就跟自己沒關系了,接下來如果有controller層的話,在這部分的代碼里監(jiān)聽這些事件,調(diào)用相應model對象的方法(其中可能封裝了model對象自己之間的依賴關系和調(diào)用,但這里的一對多復雜性不會暴露到外面去),同時也監(jiān)聽某些model對象的狀態(tài)變化,調(diào)用相應view對象的方法(或是重新渲染Virtual DOM)。所有東西綁定完成。

比如我平時用NervJS(model) + DermJS(view)+ URLKit(route) 這樣的搭配,NervJS和DermJS對象都有自帶的事件方法,此外也可以在view/model對象初始化時傳入統(tǒng)一的bus事件對象。

你寫一個UI component的時候當然不會希望它依賴特定的model,寫一個model組件的時候,也不會希望它依賴特定UI,所以一對多之類的綁定是在另一個地方(專門的業(yè)務邏輯代碼)完成的,view對象和model對象不需要也不應該知道對方有幾個、是哪些,所以也不可能『多個 Actions 分別對應 Store』。

至于『單獨一個文件』、『不斷變大變亂』的問題,跟配置路由的文件也是一回事,可以參考相關經(jīng)驗。

曾經(jīng)蠟筆沒有小新

flux里,如果需要一個動作對應多個Store,其實也是很好解決的。
在Store里面register回調(diào)的時候,可以都對這個動作進行相應就可以了,還可以通過waitFor來改變相應的順序。

如果擔心代碼變亂的話,可以再單獨寫一個constants文件,定義好觸發(fā)的事件名稱就可以了。

舉個例子:

點擊一個按鈕,觸發(fā)send事件,會更新兩個Store分別是StoreAStoreB。可以寫一個constants.js,先定義事件名稱:

constants:

module.exports = {
    "ActionTypes": {
        "SEND": "SEND"
    }
};

然后在兩個Store里面分別注冊回調(diào):

StoreA:

var AppDispatcher = require('path/to/disp'),
    constants = require('path/to/constants');

StoreA.dispatchToken = AppDispatcher.register(function(payload) {
    var action = payload.action;
    if (action.type === constants.ActionTypes.SEND) {
        // callback A
    };
});

StoreB:

var AppDispatcher = require('path/to/disp'),
    constants = require('path/to/constants');

StoreB.dispatchToken = AppDispatcher.register(function(payload) {
    var action = payload.action;
    if (action.type === constants.ActionTypes.SEND) {
        // callback B
    };
});

在觸發(fā)點擊事件的時候,在Action中觸發(fā)Disp的這個事件,就會順序執(zhí)行在StoreAStoreB中注冊的回調(diào)了:)

洪濤

當這種情況出現(xiàn)時,我通常想到的是,可不可以在在他們中間加上一層了。

曾經(jīng)蠟筆沒有小新

如果你沒看過,或者看過但忘了,這是篇值得讀的文章:

Patterns For Large-Scale JavaScript Application Architecture

簡單而言,你需要有些“約定俗成”的東西,讓view和model無需相互依賴(不管是1:1的依賴,還是1:N的依賴)。

用簡單的event和observer pattern也可以,如果業(yè)務邏輯很復雜,用mediator完成模塊間的通信和同步。

PS:理想的情況是,你的每個模塊都只知道自己(觸發(fā)什么事件,聆聽什么事件),除此之外都不管,更不會知道對方的instance,或者mediator的instance。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage