Jak złamać model knockout view w częściach za pomocą requirejs

Obecnie pracuję nad aplikacją, która powiększa się ze względu na tak dużą funkcjonalność. Tutaj przedstawię przykładowy kod, aby zrozumieć.

function test(){
    var self = this
    /*  Define Properties   */
    self.TaskSection = ko.observable()
    .
    .
    /*  Define Get Requrest */
    self.GetTasks = function(){

    }
    .
    .
    /*  Define Post Requrest    */
    self.PostTask  = function(){

    }
    .
    .

    /*  Define Helper Methods   */
    self.FormatDate  = function(){

    }   
    .
    .
    /*  Define Navigation Methods   */
    self.HomePage  = function(){

    }   
    .
    .
    /*  End */
}
OK. Całkiem proste. Możesz zobaczyć przykładowy model, ale praca z nim jest teraz trudna, ponieważ każda sekcja zawiera wiele funkcji. Przyjmijmy więcej niż 10 funkcji w każdej sekcji. Teraz chcę zarządzać aplikacją używając requirejs. Tego właśnie próbowałem.

The Structure

app/
    js/
        /Collections/   /*  For ObservableArrays    */
        /Events/        /*  For Collections and Models  */
        /Helpers/       /*  For Collections and Models  */
        /Models/        /*  Default Properties  */

Obecnie to, czego chcę jest teraz rozbić model na 3 do 4 części.

  • Kolekcja.js gdzie definiuję tylko observableArray()
  • wydarzenia.js, gdzie chcę zdefiniować funkcje związane z serwerem
  • Pomocnicy.js, gdzie chcę zdefiniować funkcje, aby wykonać jakąś wewnętrzną pracę.
Jak mogę to osiągnąć? Tego właśnie próbowałem.
define(["knockout"],function (ko) {
    function test(){
        var self = this
        self.TaskList = ko.observanleArray()
    }
    return new test()
});

define(["knockout","TaskList"],function (ko,TaskList) {
    var events  = function() {
        var self = this
        self.AddItem = function (data) {
            TaskList.push(TaskModel)
        }
        self.RemoveItem = function (data) {
            TaskList.remove(data)
        }
    }
    return new events()
});

define(["knockout","TaskList"],function (ko,TaskList) {
    var helpers  = function() {
        var self = this
        self.SortTaskList = function (data) {
            TaskList.sort()
        }
    }
    return new helpers()
});
Tutaj nie wiem, jak je połączyć. TaskList w wydarzeniach.js i pomocnik.js jest nieokreślone. Wiem, że muszę podać listę Zadań jako parametr, ale nie chcę użyj sposobu funkcji. Zamiast tego chcę użyć dosłownego sposobu, aby połączyć te dwa pliki w Tasklist.js viewmodel. Jak mogę to zrobić?
Author: Muhammad Raheel, 2014-06-18

2 answers

Myślę, że to jest przykład tego, co możesz zrobić (to jest przykład, w prawdziwym życiu można podzielić na oddzielne pliki js):

Zdefiniuj ko jako moduł (nie tak przydatny jak jest, możesz usunąć odniesienie do "knockout")

define("knockout", function () {
    return ko;
});

Zdefiniuj Moduł Dla listy zadań

define("TaskList", ["knockout"],function (ko) {
    function TaskList(){
        var self = this;
        self.NameInput = ko.observable("");
        self.DescInput = ko.observable("");
        self.TaskList = ko.observableArray();
    }
    return new TaskList();
});

Zdefiniuj moduł dla zdarzeń i odwołaj się do listy zadań

define("Events", ["knockout","TaskList"],function (ko, obj) {
    var events  = function() {
        var self = this;
        self.AddItem = function (data) {
            var inputData;
            if (typeof(data.Name) === 'undefined') {
                inputData = { Name: obj.NameInput(), 
                              Description:  obj.DescInput() };
            } else
                inputData = data;
            obj.TaskList.push(inputData);
        }
        self.RemoveItem = function (data) {
            obj.TaskList.remove(data);
        }
    }
    return new events();
});

Zdefiniuj moduł dla pomocników, który również odwołuje się do listy zadań

define("Helpers", ["knockout","TaskList"],function (ko, obj) {
    var helpers  = function() {
        var self = this;
        self.SortTaskList = function (data) {
            obj.TaskList.sort();
        }
    }
    return new helpers();
});

Zdefiniuj główny moduł, który będzie umieszczał wszystkie moduły razem

define("Main", ["knockout","TaskList", "Events", "Helpers"], 
       function (ko, obj, e, h) {
    var main  = function() {
        var self = this;
        self.Tasks = obj;
        self.Events = e;
        self.Helpers = h;
    }
    return new main();
});

Na koniec wywołaj główny moduł i spróbuj dodać element do listy zadań za pomocą modułu zdarzeń

require(["Main", "knockout"], function (main, ko) {
   main.Events.AddItem({ Name: "My first task", Description: "Start the job"});
   main.Events.AddItem({ Name:"My second task", Description:"Continue the job"});
   main.Events.AddItem({ Name: "My last task", Description: "Finish the job"});
   ko.applyBindings(main);
   console.log(main.Tasks.TaskList().length);
});

Zaktualizowane Demo

 20
Author: GôTô,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-02 07:49:10

Jedną rzeczą do rozważenia tutaj jest to, że wymagają.js nie chce tylko, aby Moduły w jednym pliku JavaScript, chce, aby rozbić Moduły na osobne Pliki, aby utrzymać moduły z coraz większych rozmiarów. Problem polega na tym, że nie masz obecnie możliwości nazwania swoich modułów, aby inni o nich wiedzieli. Rozważ to -

Tasklist.js

define(["knockout"],function (ko) {
    function test() {
        var self = this;
        self.TaskList = ko.observableArray();
    };
    return new test();
});

Wydarzenia.js

define(["knockout","app/TaskList"],function (ko,TaskList) {
    var events  = function() {
        var self = this;
        self.AddItem = function (data) {
            TaskList.push(TaskModel);
        };
        self.RemoveItem = function (data) {
            TaskList.remove(data);
        };
    }
    return new events();
});
Pomocnicy.js
define(["knockout","app/TaskList"],function (ko,TaskList) {
    var helpers = function() {
        var self = this;
        self.SortTaskList = function (data) {
            TaskList.sort();
        };
    }
    return new helpers();
});

Oczywiście zakłada to, że masz już główną.js lub jakiś punkt wejścia z wymaganiem.konfiguracja js ustawiona tak, aby wymagało znać Gdzie , aby znaleźć pliki. Jeśli nie masz, to wygląda to mniej więcej tak -

Main.js

requirejs.config({
    baseUrl: 'lib',
    paths: {
        app: '../app'
    }
});

Który zakłada, że masz coś podobnego do tego dla swojej struktury plików -

(Projekt dir)
/ app /
Main.js
Wydarzenia.js
Lista zadań.js
Pomocnicy.js

Teraz, gdy załadujesz wymagaj.js w Twoim plik html i wskaż main.js jako punkt wejścia wszystkie Twoje moduły zostaną załadowane.

 3
Author: PW Kad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-05 05:36:03